pattern.matcher () vs pattern.matches ()
Мне интересно, почему результаты java regex pattern.matcher () и pattern.matches () отличаются при условии того же регулярного выражения и той же строки
String str = "hello+"; Pattern pattern = Pattern.compile("\\+"); Matcher matcher = pattern.matcher(str); while (matcher.find()) { System.out.println("I found the text " + matcher.group() + " starting at " + "index " + matcher.start() + " and ending at index " + matcher.end()); } System.out.println(java.util.regex.Pattern.matches("\\+", str));
Результатом вышесказанного является:
I found the text + starting at index 5 and ending at index 6 false
Я обнаружил, что использование выражения для соответствия полной строке отлично работает в случае matches(".*\\+")
.
- Разделение строки на каждый n-й символ
- jQuery validate: Как добавить правило для проверки правильности выражения?
- Новые строки в sed на Mac OS X
- java.lang.StackOverflowError при использовании RegEx для синтаксического анализа больших строк
- Найти повторяющиеся фразы - любой инструмент или регулярное выражение
- Regex любой символ ASCII
- Соответствие строк с помощью шаблона
- Regex: Я хочу, чтобы это И было И что ... в любом порядке
- Почему это регулярное выражение не работает в Java?
- Как «обратный матч» с регулярным выражением?
- Как использовать регулярные выражения (регулярное выражение) в Microsoft Excel как внутри ячейки, так и в цикле
- Как извлечь n-е слово и подсчитать вхождения в строку MySQL?
- jQuery Подтвердить плагин - проверка пароля - минимальные требования - Regex
pattern.matcher(String s)
возвращает Matcher
который может находить шаблоны в String s
. pattern.matches(String str)
, если вся String ( str
) соответствует шаблону.
Вкратце (просто чтобы запомнить разницу):
-
pattern.matcher
– проверка, если строка содержит шаблон -
pattern.matches
– проверить, есть ли строка – шаблон
Matcher.find()
пытается найти следующую подпоследовательность входной последовательности, которая соответствует шаблону.
Pattern.matches(String regex, CharSequence input)
компилирует регулярное выражение в Matcher
и возвращает Matcher.matches()
.
Matcher.matches
пытается сопоставить всю область (строку) с шаблоном (Regex).
Итак, в вашем случае Pattern.matches("\\+", str)
возвращает false, поскольку str.equals("+")
является ложным.
Из Javadoc, см. If, и только если, весь участок области
/** * Attempts to match the entire region against the pattern. * * If the match succeeds then more information can be obtained via the * start, end, and group methods.
* * @return true if, and only if, the entire region sequence * matches this matcher's pattern */ public boolean matches() { return match(from, ENDANCHOR); }
Поэтому, если ваша строка была просто «+», вы получите истинный результат.
match пытается сопоставить выражение со всей строкой. Смысл, он проверяет, является ли вся строка патерном или нет. концептуально думайте так: он неявно добавляет a в начале и $ в конце вашего шаблона.
For, String str = “hello +”, если вы хотите, чтобы match () возвращал true, вам нужно иметь шаблон типа “. \ +. ”
Надеюсь, это ответ на ваш вопрос.
Pattern.matches тестирует всю строку, в вашем случае вы должны использовать:
System.out.println(java.util.regex.Pattern.matches(".*\\+", str));
Значение любой строки и символа +
Я думаю, что ваш вопрос должен быть действительно «Когда я должен использовать метод Pattern.matches()
?», И ответ «Никогда». Вы ожидали, что он вернет массив согласованных подстрок, например, методы .NET Matches
? Это вполне разумное ожидание, но нет, Java ничего подобного не имеет.
Если вы просто хотите выполнить быстрое и грязное совпадение, украсьте регулярное выражение с помощью .*
в обоих концах и используйте собственный метод match matches()
:
System.out.println(str.matches(".*\\+.*"));
Если вы хотите извлечь несколько совпадений или получить доступ к информации о совпадении после этого, создайте экземпляр Matcher и используйте его методы, как это было в вашем вопросе. Pattern.matches()
– не что иное, как потерянная возможность.
Matcher matcher = pattern.matcher(text);
В этом случае будет возвращен экземпляр объекта-собора, который выполняет операции сопоставления входного текста путем интерпретации шаблона. Тогда мы можем использовать, matcher.find()
чтобы соответствовать no. шаблонов из входного текста.
(java.util.regex.Pattern.matches("\\+", str))
Здесь объект-созерцатель будет создан неявно и будет возвращено логическое значение, которое соответствует всему тексту с шаблоном. Это будет работать так же, как str.matches(regex)
в String.
Код, эквивалентный java.util.regex.Pattern.matches("\\+", str)
, будет:
Pattern.compile("\\+").matcher(str).matches();
метод find
найдет первое вхождение шаблона в строке.