我有以下程序
public class PatternMatching {
public static void main(String[] args) {
String pattern ="a??";
Pattern pattern1 = Pattern.compile(pattern);
String findAgainst = "a";
Matcher matcher = pattern1.matcher(findAgainst);
int count=0;
while(matcher.find()){
count++;
System.out.println(matcher.group(0)+".start="+ matcher.start()+".end="+matcher.end());
}
System.out.println(count);
}
}它打印以下输出
.start=0.end=0
.start=1.end=1
2而不是
.start=0.end=0
a.start=0.end=1
.start=1.end=1
3当我使用pattern "b??"运行程序时,输出是
.start=0.end=0
.start=1.end=1
2这是正确的。输出不正确的原因是什么,即使它是一个不情愿的限定符?
发布于 2016-05-13 17:24:01
在我看来,问题是Java正则表达式引擎在遇到长度为零的匹配时使用以下算法:它将匹配的索引与当前的正则表达式索引进行比较,如果它们一致,则正则表达式索引递增。
因此,当您将a之前的空格与a??进行匹配时,正则表达式引擎会发现长度为零的匹配,并递增出现在a之后的索引,从而跳过正确的匹配。
如果您使用贪婪的版本- a? -输出将会不同:
a.start=0.end=1
.start=1.end=1
2这是因为使用了第一个a,正则表达式引擎索引在a之后,现在可以匹配字符串的末尾。
https://stackoverflow.com/questions/37205816
复制相似问题