2011-02-26 61 views
1

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

有没有办法找出是否尝试过比赛, group()并捕获IllegalStateException

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

回答

4

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

你可以封装匹配的自定义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 
} 
+0

这是我能做的最好的事情,但我对此并不满意。我想稍微简化我的类,并用许多方法创建一个添加类并不会让它变得更简单。 – maaartinus 2011-03-04 19:49:43

0

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

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

而且它不工作?

+1

它返回'Pattern.compile(S)'使用的字符串,但我想在'模式中使用的.matcher(多个)'。 – maaartinus 2011-02-26 13:20:26

+0

你想要做什么很奇怪。但是,我会将Matcher包装在包含String和Matcher的Wrapper类中。 – Friesgaard 2011-02-26 13:31:44

+1

为什么这很奇怪?我使用'Matcher'作为我班的成员,匹配器记得它是'text',如果我想避免单独记住它,你认为这很奇怪? – maaartinus 2011-02-26 13:59:00

0

我想你会得到IllegalStateException,因为你正在尝试在匹配器中间做些什么? “匹配器的显式状态最初是未定义的;试图在成功匹配之前查询匹配器的任何部分将导致抛出IllegalStateException异常。匹配器的显式状态由每个计算器重新计算匹配操作“。

+0

我在几种方法中使用matcher。如果某些条件失败,我想提供有关所发生事件的详细信息,包括匹配位置和(未)匹配的字符串。在第一场比赛尝试之前,有些条件会被测试。 – maaartinus 2011-02-26 13:23:58

相关问题