【问题标题】:How Matcher.find() works [duplicate]Matcher.find() 如何工作[重复]
【发布时间】:2012-06-25 15:39:37
【问题描述】:

我正在测试 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。

不,让我们看看迭代......


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

1 0 ""

2 1 ""

3 2 34

4 4""

5 5 ""

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

但是,存根生成 01234456。

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

它迭代循环六次..如何? 有什么建议吗?

【问题讨论】:

    标签: java regex matcher


    【解决方案1】:

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


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

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

    结果:

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

    ideone

    【讨论】:

      【解决方案2】:

      你的表达式使用*,表示0个或多个数字,所以也可以不匹配任何数字。

      用这种方式改变你的正则表达式

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

      使用+ 表示1 个或多个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-18
        • 2021-05-12
        • 2014-04-17
        • 1970-01-01
        • 1970-01-01
        • 2015-04-17
        相关资源
        最近更新 更多