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的区别