我试图理解Java中的模式匹配。但是,我对以下代码的输出感到困惑。它会打印一个2的数字,同时匹配" aa"反对" aaaa"但我希望它能打印3,因为' a'接着是' a'在给定的字符串中发生三次。任何人都可以解释这里的问题是什么吗?
Pattern p = Pattern.compile("aa");
Matcher m = p.matcher("aaaa");
int count = 0;
while(m.find())
count++;
System.out.println(count);
答案 0 :(得分:4)
匹配器不会找到重叠匹配。因此,由于第一个匹配在索引0处找到,长度为2,所以它不会在索引2之前开始寻找下一个匹配,并且找不到从索引1开始的潜在匹配。
如果您想查找重叠匹配,可以使用m.find(start)
,其中start
的索引比您之前的匹配高一个。例如:
Pattern p = Pattern.compile("aa");
Matcher m = p.matcher("aaaa");
int count = 0;
int start = 0;
while(m.find(start)) {
count++;
start = m.start() + 1;
}
System.out.println(count);
答案 1 :(得分:0)
搜索文字字符串时,您还可以使用indexOf
:
public class Test {
public static final void main(String[] ignored) {
String toFind = "aa";
String toSearch = "aaaa";
int idxLastFound = 0;
int foundCount = 0;
while(idxLastFound <= (toSearch.length() - toFind.length())) {
idxLastFound = toSearch.indexOf(toFind, idxLastFound);
if(idxLastFound == -1) {
break;
}
System.out.println("Found at " + idxLastFound);
idxLastFound++;
foundCount++;
}
System.out.println("Found " + foundCount + " times");
}
}
输出:
[C:\java_code\]java Test
Found at 0
Found at 1
Found at 2
Found 3 times