Я пытаюсь понять соответствие шаблонов в 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 с длиной два, он не начнет искать следующий матч до тех пор, пока не будет найден индекс 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);
При поиске буквенных строк вы также можете использовать 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