Подсчет последовательных повторений слова с регулярным выражением в Java - PullRequest
0 голосов
/ 13 февраля 2012

В настоящее время у меня есть шаблон регулярного выражения, который соответствует определенному слову, включая произвольные пробелы.

например. если слово было "the", мой шаблон будет соответствовать "t h e", а также "the"

У меня вопрос, есть ли способ подсчитать и отследить количество последовательных повторов? Я хочу вернуть наибольшее количество последовательных повторений слова.

например. если бы моя строка была «быстрая коричневая лиса, то она перепрыгнула через ...»

Я бы хотел, чтобы мой метод возвращал 3, а не 7. Подсчет общего числа вхождений очень прост:

Pattern p = Pattern.compile("(t\\s*h\\s*e\\s*)");
Matcher m = p.matcher(s);

while(m.find()) {
    count++;
}

Я хотел бы вернуть наибольшее количество последовательных повторений. Просто интересно, есть ли способ сделать это с помощью регулярных выражений.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2012

Мне кажется, я нашел разумное решение:

// Possible values for n:
// (t\\s*h\\s*e\\s*){1}
// (t\\s*h\\s*e\\s*){2}
// (t\\s*h\\s*e\\s*){3}...
public int consecutiveThe(String s) {
    int n = 0;
    while(true) {
         String expression = "(t\\s*h\\s*e\\s*){" + n + "}";
         Pattern p = Pattern.compile(expression);
         Matcher m = p.matcher(s);
         if(!m.find()) {
            break;
         }
         n++;
    }
    return (n - 1);
}

Идея состоит в том, чтобы перебирать последовательные значения n, проверяя, есть ли совпадение с регулярным выражением. Как только у нас будет значение n, которое не соответствует, верните число, которое было наиболее предварительно найдено в последовательности.

0 голосов
/ 13 февраля 2012

Это не проверено, но я верю, что логика звучит правильно.Удостоверьтесь, чтобы проверить на одну ошибку для всех позиций и длин.

boolean adjacentToPreviousMatch = false;
int previousPosition = 0;
int lengthOfCurrentMatch = 0;
int numSequentialMatches = 0;
ArrayList<Integer> sequences = new ArrayList<Integer>(); 
while (m.find()) {
    if (numSequentialMatches > 0 ) {
        lengthOfCurrentMatch = m.end() - m.start();
        adjacentToPreviousMatch = previousPosition + lengthOfCurrentMatch == m.end();
        if (adjacentToPreviousMatch) {
            numSequentialMatches++;
        } else {
            sequences.add(numSequentialMatches);
            numSequentialMatches = 0;
        }
    }

    previousPosition = m.end();
}

Затем вы можете просмотреть последовательности, чтобы найти максимальную последовательность.Обязательно сохраните в своем шаблоне конечный \s*.

- Другой метод может заключаться в использовании множественного числа вашего шаблона "(t\\s*h\\s*e\\s*)*", а затем переберите совпадения, извлекая захваченную строку.Затем запустите единственное регулярное выражение "(t\\s*h\\s*e\\s*)" для этой захваченной строки и просто выполните while(m.find()) count++;, потому что вы знаете, что они смежны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...