如何找出匹配器的状态?

时间:2011-02-26 13:05:56

标签: java regex

有没有办法从java.util.regex.Matcher获取文本?它似乎是只写的。有设置方法(reset(CharSequence input)),但没有吸气剂(除非我忽略它)。还有一种获取模式的方法(pattern()),但文本是私有的,没有任何getter。为什么呢?

有没有办法找出是否尝试过匹配,然后调用例如group()并抓住IllegalStateException

我问这个是因为我使用Matcher作为成员,并且不想在其他成员中重复这些信息,因为它不必要地破坏了这个类。

3 个答案:

答案 0 :(得分:4)

正如文档所示,您是对的:无法从匹配器获取文本或知道是否已执行匹配操作。

您可以将匹配器封装在为您保存状态的自定义可复制类中:

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
}

答案 1 :(得分:0)

根据文档,您应该可以致电

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

它不起作用?

答案 2 :(得分:0)

我猜你得到IllegalStateException,因为你试图在匹配器中间做一些事情?

这是来自API “匹配器的显式状态最初是未定义的;在成功匹配之前尝试查询它的任何部分将导致抛出IllegalStateException。匹配器的显式状态由每个匹配操作重新计算。”