Java Matcher find is false but matches is true
Я попытался разобрать строку с помощью регулярного выражения, но столкнулся с каким-то странным поведением
System.out.println(m.matches()); //returns true
System.out.println(m.find()); //returns false
Похоже, у меня есть несколько ошибок в моем регулярном выражении. Весь код приведен ниже
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class testRegexp {
public static void main(String[] args) {
String string = "Alexandr TheMakedonian 32";
Pattern pattern = Pattern.compile("(.*)\\s(.*)\\s(.*)");
Matcher m = pattern.matcher(string);
System.out.println(m.matches());
System.out.println(m.find());
System.out.println(m.groupCount());
if( m.find() && m.groupCount() >= 3) {
String firstName = m.group(1);
String secondName = m.group(2);
String ages = m.group(3);
System.out.println(firstName);
System.out.println(secondName);
System.out.println(ages);
}
}
}
Ответы (1 шт):
Автор решения: Nowhere Man
→ Ссылка
Вызов String.matches() сравнивает целую строку с шаблоном и после этого позиция для нового поиска перемещается в конец и соответственно последующий вызов find вернёт false, так как будет сравниваться пустая строка с шаблоном, в котором есть как минимум два пробела.
Если к примеру переставить вызовы данных методов местами или "сбросить" поиск при помощи Matcher::reset, оба вызова вернут true:
System.out.println(m.find()); // true
System.out.println(m.matches()); // true
Matcher m1 = pattern.matcher(string);
System.out.println(m1.matches()); // true
m1.reset();
System.out.println(m1.find()); // true