Matcher.find()工作原理[复制](How Matcher.find() works [d

2019-06-25 17:11发布

这个问题已经在这里有一个答案:

  • SCJP6正则表达式的问题 1个回答

我测试匹配器和图形类的小存根......看到下面的小存根..

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的。

诺埃让看到的迭代...


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

1 0 “”

2 1 “”

3 2 34

4 4 “”

5 “”

现在..let结合...... matcher.start()+ matcher.group()......输出按我们的计算公式为:0123445

但是,存根生成01234456。

我无法从其中“6”来理解。 字符串索引从零开始,因此在这里可以有最大的指数是5.So从那里6来临?

它遍历环路6个times..How? 任何建议?

Answer 1:

正则表达式可以匹配零个字符。 最终匹配是在字符串的结尾处出现的索引5.零宽度的字符串的字符因此这个零宽度的字符串的索引号为6。


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

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

结果:

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

IDEON



Answer 2:

你的表达式中使用* ,这意味着0个或多个数字,所以也没有匹配的数字。

改变这样的正则表达式

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

使用+是指1或大于1。



文章来源: How Matcher.find() works [duplicate]