Какое состояние сохраняется в matcher.find () Java после неудачного сопоставления с квантификаторами? - PullRequest
1 голос
/ 14 июня 2011

В дальнейшем я ожидаю, что второй 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 () - это , предполагаемое , чтобы начинаться либо с начала (если нет предыдущего совпадения), либо с индекса последнего успешного совпадения. UsePattern () имеет значение предполагается , чтобы сохранить позицию Matcher во входных данных и отбросить информацию о группе (что, опять же, я не использовал явно).

Я что-то упустил, но я не знаю что. Я подозреваю, что мне нужно реализовать это с помощью LookingAt () и обновить регион (например, этот пример ), но я не знаю, почему этот подход не работает.

Ответы [ 2 ]

5 голосов
/ 14 июня 2011

Ваш первый регулярное выражение потребляет всю строку (\\\\s*). Когда запускается второе регулярное выражение, нечего сопоставлять.

Если вы позвоните matcher.reset(), он будет работать как положено.

1 голос
/ 14 июня 2011

Похоже, что документация немного вводит в заблуждение (или, фактически, она просто не указывает), каково поведение при вызове find() после сбоя.

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

Просмотр исходного кода подтверждает, что Matcher имеет индекс (поле last), по которому он начинает поиск при выполнении следующего 'find ()', а также при сбое find() этот индекс продвигается до конца и не сбрасывается.

reset() сбрасывает этот индекс, usePattern() нет.

...