Как узнать состояние Matcher? - PullRequest
1 голос
/ 26 февраля 2011

Есть ли способ получить текст из java.util.regex.Matcher? Кажется, только для записи. Есть метод, чтобы установить это (reset(CharSequence input)), но нет получателя (если я не пропускаю это). Есть также метод для получения шаблона (pattern()), но текст является приватным без какого-либо метода получения. Почему?

Есть ли способ узнать, была ли сделана попытка совпадения, кроме как позвонить, например, group() и ловить IllegalStateException?

Я спрашиваю об этом, потому что я использую Matcher в качестве члена и не хочу повторять информацию в дополнительных членах, так как это бесполезно захламляет класс.

Ответы [ 3 ]

4 голосов
/ 26 февраля 2011

Как показывает документация, вы правы: нет способа получить текст из средства сопоставления или узнать, была ли выполнена соответствующая операция.

Вы можете инкапсулировать совпадение внутри пользовательского класса, в котором можно найти состояние:

public class StatefulMatcher {

    private Matcher matcher;
    private CharSequence input;
    private boolean matchDone;

    public StatefulMatcher(Pattern pattern, String input) {
        this.input = input;
        this.matcher = pattern.matcher(input);
    }

    public void reset(CharSequence input) {
        this.input = input;
        this.matcher.reset(input);
        this.matchDone = false;
    }

    public boolean matches() {
        matchDone = true;
        return matcher.matches();
    }

    public boolean isMatchDone() {
        return matchDone;
    }

    public CharSequence getInput() {
        return input;
    }

    // other methods
}
0 голосов
/ 26 февраля 2011

Я полагаю, вы получаете исключение IllegalStateException, потому что вы пытаетесь что-то сделать в середине сопоставления?

Это из API "Явное состояние сопоставителя изначально не определено; попытка запросить любую его часть перед успешным совпадением вызовет исключение IllegalStateException. Явное состояние сопоставителя пересчитываетсякаждая операция сопоставления. "

0 голосов
/ 26 февраля 2011

Согласно документации, у вас должна быть возможность звонить

Matcher m = ...;
m.pattern().pattern();

А это не работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...