Matcher.find()如何工作

我正在测试Matcher和Pattern类的一个小存根…请参阅下面的小存根..

package scjp2.escape.sequence.examples; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Sample_19 { public static void main(String a[]){ String stream = "ab34ef"; Pattern pattern = Pattern.compile("\\d*"); //HERE * IS GREEDY QUANTIFIER THAT LOOKS FOR ZERO TO MANY COMBINATION THAT //START WITH NUMBER Matcher matcher = pattern.matcher(stream); while(matcher.find()){ System.out.print(matcher.start()+matcher.group()); } } } 

这里……我们比较的字符串是“ab34ef”。 长度为6。

Noe让我们看看迭代……


迭代否matcher.start()matcher.group()

1 0“”

2 1“”

3 2 34

4 4“”

5 5“”

现在..let结合… matcher.start()+ matcher.group()….根据我们的计算输出是:0123445

但是,存根生成01234456。

我无法理解“6”的来源。 字符串索引从零开始,所以这里可以有最大索引是5.So从哪里来的?

它循环遍历循环六次……怎么样? 有什么建议吗?

您的正则表达式可以匹配零个字符。 最终匹配是在字符串末尾出现的零宽度字符串,位于索引5处的字符之后 。因此,此零宽度字符串的索引为6。


另外,如果使用分隔符使输出更具可读性,您可能还会发现更容易理解发生了什么:

 System.out.println(matcher.start()+ ": " + matcher.group()); 

结果:

 0: 1: 2: 34 4: 5: 6: 

ideone

你的表达式使用*表示0位或更多位数,因此也不能匹配任何数字。

以这种方式更改正则表达式

 Pattern pattern = Pattern.compile("\\d+"); 

使用+表示1或更多。