Matcher.find() 如何工作[重复]

Posted

技术标签:

【中文标题】Matcher.find() 如何工作[重复]【英文标题】:How Matcher.find() works [duplicate] 【发布时间】: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 是从哪里来的??

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

【问题讨论】:

【参考方案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 个或多个。

【讨论】:

以上是关于Matcher.find() 如何工作[重复]的主要内容,如果未能解决你的问题,请参考以下文章

当 Matcher.find() 运行时间过长时,如何终止它?

matcher.find() 匹配成功,但是System.out.println(matcher.find())返回false

JAVA正则表达式,matcher.find和 matcher.matches的区别

正则表达式里matcher.find()一直为false

正则表达式Matcher.find报错 java.lang.StackOverflowError解决

如何在匹配器组而不是整个模式上追加替换?