我的代码:零长度在Java中的正则表达式匹配
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'的零次或一次出现。
的Java API说:
- matcher.start()返回在以前匹配的初始索引。
- matcher.end()返回匹配的最后一个字符后的偏移量。
- matcher.group()返回匹配前一个 匹配的输入子序列。对于输入序列为s的匹配器m,表达式 m.group()和s.substring(m.start(),m.end())是等价的。对于 ,某些模式(例如a *)与空字符串匹配。当模式成功匹配 输入中的空字符串时,此方法 将返回空字符串。
我想知道的:
- 在哪些情况下不会对正则表达式引擎遇到一个零 发生的指定字符(S)的 - 这里是字符 'A'。
- 在那些情况下,匹配器中的start(), end()和group()方法实际返回的值是什么。我已经提到了java API所说的 。但就上述情况而言,我还不太清楚。
+1提的贪婪量词的行为的解释。但是最后5 [5]呢?为什么它总是在每个字符串的末尾添加0出现? – namalfernandolk 2012-03-28 12:50:43
让我们用字符串“a”来举一个简单的例子。引擎从0开始,并尝试匹配'a' - >成功,所以首先匹配并将forwars移动到位置1的位置1,它尝试1匹配匹配 - >失败,因为到达字符串末尾。它仍然可以进行0次匹配 - >成功。然后它向前移动 - >字符串结尾 - >匹配结束 – 2012-03-28 12:55:22
非常感谢Guillaume。但是在成功匹配'a'之后为什么以及如何向前发展。没有更多的索引;并没有更多的字符。不是吗? – namalfernandolk 2012-03-28 13:11:26