我的代码:
Pattern pattern = Pattern.compile("a?");
Matcher matcher = pattern.matcher("ababa");
while(matcher.find()){
System.out.println(matcher.start()+"["+matcher.group()+"]"+matcher.end());
}
输出 :
0[a]1
1[]1
2[a]3
3[]3
4[a]5
5[]5
我知道的 :
Java API 说:
- matcher.start() 返回上一个匹配的开始索引。
- matcher.end() 返回最后一个匹配字符之后的偏移量。
- matcher.group() 返回与前一个匹配的输入子序列
匹配。对于具有输入序列 s 的匹配器 m,表达式
m.group() 和 s.substring(m.start(), m.end()) 是等效的。而对于
某些模式(例如 a*)与空字符串匹配。这个方法
当模式成功匹配时将返回空字符串
输入中的空字符串。
我想知道的是:
- 正则表达式引擎在哪些情况下会遇到零
给定字符的出现 - 此处为字符“a”。
- 在这种情况下,start() 实际返回的值是什么,
匹配器中的 end() 和 group() 方法。我已经提到过什么
java API 说。但说到实际我就不太清楚了
情况如上。
The ?
是一个贪婪量词,因此它会首先尝试匹配 1 次出现,然后再尝试匹配 0 次出现。在你的字符串中,
- 它从第一个字符“a”开始,并尝试匹配 1 次出现。 'a' 字符匹配,因此它返回您看到的第一个结果
- 然后它向前移动并找到“b”。 “b”字符与正则表达式 1 次出现不匹配,因此引擎回溯并尝试匹配 0 次出现。结果是空字符串被匹配——>你得到第二个结果。
- 然后它会移到 b 之前,因为那里不可能再有匹配项,并且它会以第二个“a”字符重新开始。
- 等等...你明白了...
它比这更复杂一些,但这就是主要思想。当 1 次出现无法匹配时,它将尝试 0 次出现。
至于 start、end 和 group 的值,它们将是匹配开始、结束的位置,而组是已匹配的内容,因此在字符串的第一个 0 出现匹配中,您将得到 1、1 和空字符串。我不确定这是否真的回答了你的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)