Matcher.find()的工作原理

时间:2012-06-23 17:14:42

标签: java regex matcher

我正在测试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从哪里开始?

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

2 个答案:

答案 0 :(得分:15)

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


顺便说一下,如果使用分隔符使输出更具可读性,您可能还会发现更容易理解正在发生的事情:

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

结果:

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

ideone

答案 1 :(得分:9)

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

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

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

使用+表示1个或更多。