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(".*\\+") .

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 найдет первое вхождение шаблона в строке.

  • Идентификатор частного IP-адреса в регулярном выражении
  • Как работает регулярное выражение '(? <= #) + (? = #)'?
  • Найти и убить процесс в одной строке с помощью bash и regex
  • Захват квантификаторов и арифметика квантификаторов
  • Удалить все не «словарные символы» из String в Java, оставив акцентированные символы?
  • Как извлечь две последовательные цифры из текстового поля в MySQL?
  • Разница между std :: regex_match и std :: regex_search?
  • разделить строку, разделенную запятыми, как с кавычками, так и с номерами без кавычек
  • Используйте функцию в Powershell replace
  • Как выполнить подстановку Perl в строке при сохранении оригинала?
  • Перекрывающиеся совпадения в R
  • Давайте будем гением компьютера.