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
→ Ссылка