gpt4 book ai didi

java - 为什么零长度字符总是保留在 java 正则表达式模式 a 的源字符串的末尾?

转载 作者:行者123 更新时间:2023-11-29 08:07:56 25 4
gpt4 key购买 nike

Pattern pattern = Pattern.compile("a?");
Matcher matcher = pattern.matcher("a");
while(matcher.find()){
System.out.println(matcher.start()+"["+matcher.group()+"]"+matcher.end());
}

输出:

0[a]1
1[]1

为什么这会给我两个输出,而只有一个字符作为匹配器。

我注意到对于这个模式,它总是在源字符串的末尾给出一个零长度。例如:当 source 是 "abab"时,它给出

0[a]1
1[]1
2[a]3
3[]3
4[]4

最佳答案

正则表达式特殊字符 ?(问号)表示“匹配前面的事物零次或一次”。

由于您在 while 循环中进行匹配 (while (matcher.find()) {...) 它会找到表达式的两个匹配项 - 出现一次“a”(在位置 0 ,字符串“a”)和零次出现的“a”(在位置 1,最后是空字符串)。

这是您的代码片段匹配的内容(开始/结束索引由 X/Y 表示):

String: " a b a b "
├─┼─┼─┼─┤
Index: 0 1 2 3 4
Match: ╰┬╯ ╰┬╯ ╰- the empty string 4/4 (zero occurrences of "a").
|| |╰- the empty string 3/3 (zero occurrences of "a").
|| ╰ the string "a" 2/3 (one occurrence of "a").
|╰ the empty string 1/1 (zero occurrences of "a").
╰ the string "a" 0/1 (one occurrence of "a").

它在位置 0/0 或 2/2 不匹配,因为表达式是贪婪的,这意味着它会尝试考虑下一个字符(在位置 0/1、2/3),只要它不匹配' t 使匹配无效,它不会使它们被跳过。举例来说,如果您要将字符串 "bbbb" 与模式 a? 进行匹配,那么您将得到五个空字符串,每个空字符串对应开头、结尾, 以及每个字符之间。

关于java - 为什么零长度字符总是保留在 java 正则表达式模式 a 的源字符串的末尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9911954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com