我正在测试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。
Noe让我们看看迭代......
1 0“”
2 1“”
3 2 34
4 4“”
5 5“”
现在..let结合... matcher.start()+ matcher.group().... 根据我们的计算,输出是:0123445
但是,存根生成01234456。
我无法理解“6”的来源。 字符串索引从零开始,所以这里可以有最大索引是5.So从哪里开始?
它循环遍历循环六次......怎么样? 有什么建议吗?
答案 0 :(得分:15)
您的正则表达式可以匹配零个字符。最后一个匹配是在字符串末尾出现的零宽度字符串,在索引5处的字符之后。因此,此零宽度字符串的索引为6.
顺便说一下,如果使用分隔符使输出更具可读性,您可能还会发现更容易理解正在发生的事情:
System.out.println(matcher.start()+ ": " + matcher.group());
结果:
0:
1:
2: 34
4:
5:
6:
答案 1 :(得分:9)
您的表达式使用*
表示0位或更多位数,因此也不能匹配任何数字。
以这种方式更改正则表达式
Pattern pattern = Pattern.compile("\\d+");
使用+
表示1个或更多。