17

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

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

但是,存根生成 01234456。

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

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

4

2 回答 2

15

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


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

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

结果:

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

ideone

于 2012-06-23T17:16:27.403 回答
10

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

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

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

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

于 2012-06-23T17:28:38.273 回答