Вопрос-ответ

Difference between matches() and find() in Java Regex

Разница между matches() и find() в регулярных выражениях Java

Я пытаюсь понять разницу между matches() и find().

Согласно Javadoc, (насколько я понимаю), matches() будет выполнять поиск по всей строке, даже если найдет то, что ищет, и find() остановится, когда найдет то, что ищет.

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

На мой взгляд, тогда класс String должен иметь find() вместо matches() встроенного метода.

Итак, подведем итог:


  1. Верно ли мое предположение?

  2. Когда полезно использовать matches() вместо find()?

Переведено автоматически
Ответ 1

matches пытается сопоставить выражение со всей строкой и неявно добавляет ^ в начале и $ в конце вашего шаблона, что означает, что он не будет искать подстроку. Отсюда вывод этого кода:

public static void main(String[] args) throws ParseException {
Pattern p = Pattern.compile("\\d\\d\\d");
Matcher m = p.matcher("a123b");
System.out.println(m.find());
System.out.println(m.matches());

p = Pattern.compile("^\\d\\d\\d$");
m = p.matcher("123");
System.out.println(m.find());
System.out.println(m.matches());
}

/* output:
true
false
true
true
*/

123 является подстрокой a123b поэтому find() метод выдает true . matches() только "видит", a123b что не совпадает с 123 и, следовательно, выдает false .

Ответ 2

matches возвращает true, если вся строка соответствует заданному шаблону. find пытается найти подстроку, соответствующую шаблону.

Ответ 3

  • matches() - возвращает только true, если совпадает полная строка

  • find() - попытается найти следующее вхождение в подстроке, которая соответствует регулярному выражению.

Обратите внимание на ударение на " следующем" в случае find(). Это означает, что результат многократного вызова find() может быть разным. Кроме того, с помощью find() вы можете вызвать start(), чтобы вернуть позицию, с которой была сопоставлена подстрока.


Пример

final Matcher subMatcher = Pattern.compile("\\d+").matcher("skrf35kesruytfkwu4ty7sdfs");
System.out.println("Found: " + subMatcher.matches());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find());
System.out.println("Found: " + subMatcher.find());
System.out.println("Matched: " + subMatcher.matches());

System.out.println("-----------");
final Matcher fullMatcher = Pattern.compile("^\\w+$").matcher("skrf35kesruytfkwu4ty7sdfs");
System.out.println("Found: " + fullMatcher.find() + " - position " + fullMatcher.start());
System.out.println("Found: " + fullMatcher.find());
System.out.println("Found: " + fullMatcher.find());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());

Вывод

Found: false
Found: true - position 4
Found: true - position 17
Found: true - position 20
Found: false
Found: false
Matched: false
-----------
Found: true - position 0
Found: false
Found: false
Matched: true
Matched: true
Matched: true
Matched: true

Итак, будьте осторожны при вызове find() несколько раз, если Matcher объект не был сброшен, даже если регулярное выражение окружено ^ и $, чтобы соответствовать полной строке.

Ответ 4

find() будет рассматривать вложенную строку по сравнению с регулярным выражением, где as matches() будет рассматривать полное выражение.

find() возвращает true только в том случае, если подстрока выражения соответствует шаблону.

public static void main(String[] args) {
Pattern p = Pattern.compile("\\d");
String candidate = "Java123";
Matcher m = p.matcher(candidate);

if (m != null){
System.out.println(m.find());//true
System.out.println(m.matches());//false
}
}
java regex