Java 如何了解匹配者的状态?

Java 如何了解匹配者的状态?,java,regex,Java,Regex,有没有办法从java.util.regex.Matcher获取文本?它似乎是只写的。有设置它的方法(reset(CharSequence输入)),但没有getter(除非我忽略了它)。还有一种获取模式的方法(pattern()),但是文本是私有的,没有任何getter。为什么? 是否有一种方法可以确定在调用例如group()和捕获IllegalStateException之后是否尝试了匹配 我问这个问题是因为我使用了一个匹配器作为成员,不想在其他成员中重复这些信息,因为它会不必要地破坏类。根据文

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

是否有一种方法可以确定在调用例如
group()
和捕获
IllegalStateException
之后是否尝试了匹配


我问这个问题是因为我使用了一个
匹配器作为成员,不想在其他成员中重复这些信息,因为它会不必要地破坏类。

根据文档,您应该能够调用

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

而且它不起作用吗?

根据文档,您应该可以拨打

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

它不起作用?

我猜你会得到非法状态异常,因为你想在匹配器中间做些什么? 这是来自API的
“匹配器的显式状态最初是未定义的;在成功匹配之前尝试查询其中的任何部分将导致引发IllegalStateException。每个匹配操作都会重新计算匹配器的显式状态。”

我猜您会得到IllegalStateException,因为你想在比赛中间做些什么? 这是来自API的
“匹配器的显式状态最初未定义;在成功匹配之前尝试查询其中的任何部分将导致引发IllegalStateException。匹配器的显式状态由每个匹配操作重新计算。”

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

您可以将matcher封装在为您保存状态的自定义rusable类中:

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
}

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

您可以将matcher封装在为您保存状态的自定义rusable类中:

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
}

这将返回
Pattern.compile
中使用的字符串,但我需要
Pattern.matcher
中使用的字符串。您想做的事情很奇怪。但是,我会将匹配器包装在一个包含字符串和匹配器的包装器类中。为什么会奇怪???我使用
匹配器作为类的成员,匹配器记住它是
文本
,您认为如果我不想单独记住它会很奇怪吗?匹配器类显然不是字符串包装器/容器,我看不出将其保存为成员的原因。我会保存字符串,然后在需要时编译模式。但我当然不知道你需要多久使用一次匹配器…我从头到尾都需要匹配器。当出现问题时,我需要字符串,我更希望将其从匹配器中取出。这将返回
模式.compile
中使用的字符串,但我需要
模式.Matcher
中使用的字符串。您想做的事情很奇怪。但是,我会将匹配器包装在一个包含字符串和匹配器的包装器类中。为什么会奇怪???我使用
匹配器作为类的成员,匹配器记住它是
文本
,您认为如果我不想单独记住它会很奇怪吗?匹配器类显然不是字符串包装器/容器,我看不出将其保存为成员的原因。我会保存字符串,然后在需要时编译模式。但我当然不知道你需要多久使用一次匹配器…我从头到尾都需要匹配器。当出现问题时,我需要字符串,我更愿意将其从匹配器中取出。我在几种方法中使用匹配器。如果某些条件失败,我想提供关于发生了什么的详细信息,包括匹配位置和(未)匹配字符串。在第一次尝试匹配之前,会测试一些条件。我在几种方法中使用matcher。如果某些条件失败,我想提供关于发生了什么的详细信息,包括匹配位置和(未)匹配字符串。在第一场比赛之前,有些条件会被测试。这是我能做的最好的事情,但我真的不高兴。我想简化一下我的类,但创建一个包含许多方法的加法类并不能使它变得更简单。这是我能做的最好的事情,但我真的对此不满意。我想简化一下我的类,但是创建一个包含许多方法的加法类并不能使它变得更简单。