Основная проблема использования регулярных выражений Java - PullRequest
1 голос
/ 11 мая 2010

работает следующий код:

String str= "test with foo hoo";
Pattern pattern = Pattern.compile("foo");
Matcher matcher = pattern.matcher(str);

if(matcher.find()) { ... }

Но этот пример не:

if(Pattern.matches("foo", str)) { ... }

И ни одна из этих версий:

if(str.matches("foo")) { ... }

В реальном коде str - это фрагмент текста с несколькими строками, если средство сопоставления обрабатывает его по-разному, также в реальном коде, замена будет использоваться для замены строки текста.

В любом случае, странно, что он работает в первой версии, но не в двух других.

Редактировать

Хорошо, я понимаю, что поведение в первом примере такое же, если вместо matcher.find используется if(matcher.matches()) { ... }. Я все еще не могу заставить его работать для многострочного ввода, но я все равно придерживаюсь решения Pattern.compile / Pattern.matcher.

Ответы [ 2 ]

3 голосов
/ 11 мая 2010

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

Вы можете обойти это, используя .*foo.*. Использование Matcher.find является более гибким решением, поэтому я рекомендую придерживаться этого.

1 голос
/ 11 мая 2010

В Java String.matches делегирует Pattern.matches, который в свою очередь делегирует Matcher.matches, который проверяет, соответствует ли регулярное выражение вся строка .

Из java.util.regex.Matcher API :

После создания средство сопоставления может использоваться для выполнения трех различных типов операций сопоставления:

  • Метод matches пытается сопоставить всю входную последовательность с шаблоном.
  • Метод lookingAt пытается сопоставить последовательность ввода, начиная с начала, с шаблоном.
  • Метод find сканирует входную последовательность в поисках следующей подпоследовательности, которая соответствует шаблону.

Чтобы найти, соответствует ли подстрока pattern , вы можете:

  • Matcher.find() pattern в строке
  • Проверьте, вся ли строка matches .*pattern.*

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

Вкл. matches() совпадение целое строка:

Вкл. hitEnd() для частичного соответствия:

В режиме многострочного или однострочного / Pattern.DOTALL режима:

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