Сопоставление «aa» с «aaaa» возвращает счетчик 2 в java - я хочу, чтобы это было 3 [дубликата]

1

Я пытаюсь понять соответствие шаблонов в 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
    Не включает перекрытия.
  • 1
    Сопоставитель будет перезапущен после сопоставленного текста; только если совпадение пустое, оно автоматически сдвигает один символ (чтобы избежать бесконечного совпадения). Это в значительной степени поведение всех двигателей регулярных выражений
Теги:
pattern-matching

2 ответа

4
Лучший ответ

Матчи не найдут совпадающие совпадения. Так как первое совпадение найдено в индексе 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);
  • 0
    Благодарю. Кстати, нужно поставить чек на начало для переполнения.
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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню