Регулярное выражение: строка соответствия, содержащая только неповторяющиеся слова - PullRequest
3 голосов
/ 21 мая 2010

У меня есть такая ситуация (код Java): 1) строка, такая как: «Дикое приключение» должна совпадать. 2) строка с соседними повторяющимися словами: «Дикое дикое приключение» не должно совпадать.

С этим регулярным выражением:. * \ B (\ w +) \ b \ s * \ 1 \ b. * Я могу сопоставить строки, содержащие соседние повторяющиеся слова.

Как изменить ситуацию, т. Е. Как сопоставить строки, которые не содержат соседних повторяющихся слов

1 Ответ

6 голосов
/ 21 мая 2010

Использовать отрицательное прогнозное утверждение, (?!pattern).

    String[] tests = {
        "A wild adventure",      // true
        "A wild wild adventure"  // false
    };
    for (String test : tests) {
        System.out.println(test.matches("(?!.*\\b(\\w+)\\s\\1\\b).*"));
    }

Объяснение предоставлено Рик Мишам explain.pl:

REGEX: (?!.*\b(\w+)\s\1\b).*
NODE                     EXPLANATION
--------------------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
    \b                       the boundary between a word char (\w)
                             and something that is not a word char
--------------------------------------------------------------------------------
    (                        group and capture to \1:
--------------------------------------------------------------------------------
      \w+                      word characters (a-z, A-Z, 0-9, _) (1
                               or more times (matching the most
                               amount possible))
--------------------------------------------------------------------------------
    )                        end of \1
--------------------------------------------------------------------------------
    \s                       whitespace (\n, \r, \t, \f, and " ")
--------------------------------------------------------------------------------
    \1                       what was matched by capture \1
--------------------------------------------------------------------------------
    \b                       the boundary between a word char (\w)
                             and something that is not a word char
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
  .*                       any character except \n (0 or more times
                           (matching the most amount possible))

Смотри также

Похожие вопросы


Примечание

Отрицательные утверждения имеют смысл только тогда, когда есть и другие шаблоны, которые вы хотите положительно сопоставить (см. Примеры выше). В противном случае вы можете просто использовать логический оператор дополнения ! для отрицания matches с любым шаблоном, который вы использовали ранее.

String[] tests = {
    "A wild adventure",      // true
    "A wild wild adventure"  // false
};
for (String test : tests) {
    System.out.println(!test.matches(".*\\b(\\w+)\\s\\1\\b.*"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...