В дальнейшем я ожидаю, что второй find() будет успешным, но это не так. Почему?
Matcher matcher =
Pattern.compile("\\s*asdf").matcher("apple banana cookie");
// returns false as expected
matcher.find();
// resets groups (that weren't being explicitly being used anyway), but not state.
matcher.usePattern(Pattern.compile("\\s*banana"));
// returns false, expected true.
System.out.println(matcher.find());
Если квантификатор удаляется из первого регулярного выражения (становится просто asdf), второе совпадение завершается успешно. Глядя на объект Matcher, мы обнаруживаем, что какая-то групповая информация сохраняется после первого неудачного find(), хотя я этого не ожидал. Find() — это предполагается начинать либо с начала (если нет предыдущего совпадения), либо с индекса последнего успешного совпадения. UsePattern() — это предполагалось сохранять позицию Matcher во входных данных и отбрасывать информацию о группе (которую, опять же, я не использовал явно).
Я что-то упускаю, но не знаю что. Я подозреваю, что мне нужно реализовать это с помощью lookAt() и обновить регион (например, этот пример), но я не знаю, почему этот подход не работает.