pattern.matcher () против pattern.matches () - PullRequest
30 голосов
/ 05 октября 2010

Мне интересно, почему результаты регулярных выражений java 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(".*\\+").

Ответы [ 8 ]

34 голосов
/ 05 октября 2010

pattern.matcher(String s) возвращает Matcher, который может найти паттернов в строке s. pattern.matches(String str) проверяет, соответствует ли вся строка (str) шаблону.

Вкратце (просто чтобы запомнить разницу):

  • pattern.matcher - проверить, содержит ли строка -a pattern
  • pattern.matches - проверить, является ли строка is-a pattern
4 голосов
/ 05 октября 2010

Matcher.find() пытается найти следующую подпоследовательность входной последовательности, которая соответствует шаблону.

Pattern.matches(String regex, CharSequence input) компилирует регулярное выражение в Matcher и возвращает Matcher.matches().

Matcher.matches пытается сопоставить всю область (строку) с шаблоном (Regex).

Итак, в вашем случае Pattern.matches("\\+", str) возвращает false, поскольку str.equals("+") false.

3 голосов
/ 05 октября 2010

Из Javadoc, посмотрите, если и только если, весь регион раздел

   /**
     * Attempts to match the entire region against the pattern.
     *
     * <p> If the match succeeds then more information can be obtained via the
     * <tt>start</tt>, <tt>end</tt>, and <tt>group</tt> methods.  </p>
     *
     * @return  <tt>true</tt> if, and only if, <b>the entire region</b> sequence
     *          matches this matcher's pattern
     */
    public boolean matches() {
        return match(from, ENDANCHOR);
    }

Так что, если бы ваша строка была просто "+", вы бы получили истинный результат.

2 голосов
/ 29 сентября 2013

совпадений пытается сопоставить выражение со всей строкой.Смысл, он проверяет, является ли вся строка патерном или нет.концептуально думайте так, он неявно добавляет ^ в начале и $ в конце вашего паттерна.

Для, String str = "hello +", если вы хотите, чтобы match () возвращал true, вам нужноиметь шаблон типа ". \ +. "

Я надеюсь, что это ответило на ваш вопрос.

0 голосов
/ 20 августа 2018

Код, эквивалентный java.util.regex.Pattern.matches("\\+", str), будет выглядеть следующим образом:

Pattern.compile("\\+").matcher(str).matches();

метод find найдет первое вхождение шаблона в строке.

0 голосов
/ 20 августа 2018
Matcher matcher = pattern.matcher(text);

В этом случае будет возвращен экземпляр объекта соответствия, который выполняет операции сопоставления входного текста путем интерпретации шаблона.Тогда мы можем использовать, matcher.find(), чтобы соответствовать нет.шаблонов из входного текста.

(java.util.regex.Pattern.matches("\\+", str))

Здесь, объект соответствия будет создан неявно, и будет возвращено логическое значение, которое соответствует всему тексту с шаблоном.Это будет работать так же, как функция str.matches(regex) в String.

0 голосов
/ 06 октября 2010

Я думаю, что ваш вопрос должен звучать так: «Когда я должен использовать метод Pattern.matches()?», А ответ - «Никогда». Вы ожидали, что он вернет массив совпадающих подстрок, как это делают методы .NET Matches? Это вполне разумное ожидание, но нет, у Java нет ничего подобного.

Если вы просто хотите сделать быстрое и грязное совпадение, украсьте регулярное выражение с .* на обоих концах и используйте собственный метод matches() строки:

System.out.println(str.matches(".*\\+.*"));

Если вы хотите извлечь несколько совпадений или впоследствии получить доступ к информации о совпадении, создайте экземпляр Matcher и используйте его методы, как вы делали в своем вопросе. Pattern.matches() - это не что иное, как упущенная возможность.

0 голосов
/ 05 октября 2010

Pattern.matches тестирует всю строку, в вашем случае вы должны использовать:

 System.out.println(java.util.regex.Pattern.matches(".*\\+", str));

Значение любой строки и символ +

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