Matcher.find() 如何工作

2022-09-02 21:15:38

我正在测试匹配器和模式类的一个小存根...请参阅以下小存根。

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。

诺伊让我们看看迭代...


Iteration NO matcher.start() matcher.group()

1 0 ""

2 1 ""

3 2 34

4 4 ""

5 5 ""

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

但是,存根会生成01234456。

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

它循环访问六次。如何?有什么建议吗?


答案 1

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


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

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

结果:

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

维酮


答案 2

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

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

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

使用意味着 1 个或更多。+