我从去年开始研究这个问题:Java Regex 中的零长度匹配:
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
我想知道这是否正确。该模式匹配“a”或空字符串。当 Matcher 指向第一个“b”时,没有“a”,所以 find() 匹配空字符串。
但是,javadoc说:
此方法从该匹配器区域的开头开始,或者,如果该方法的先前调用成功并且匹配器此后尚未重置,则从前一个匹配不匹配的第一个字符开始。
所以当Matcher指向'b'时,没有匹配到任何字符,而find()匹配的是一个空字符串,也就是说之后的第一个匹配不匹配的字符(即空字符串)仍然是'b '。这应该意味着下一个 find() 应该从同一个地方开始,根据上面的说法,这意味着代码应该无限循环。但当然这不是正在发生的事情。当匹配一个空字符串时,它看起来只是将起点提高了 1。
那么这是什么一回事?是实现错误,还是 javadoc 遗漏了什么,或者我遗漏了什么?