有没有办法从java.util.regex.Matcher获取文本?它似乎是只写的。有设置方法(reset(CharSequence input)
),但没有吸气剂(除非我忽略它)。还有一种获取模式的方法(pattern()
),但文本是私有的,没有任何getter。为什么呢?
有没有办法找出是否尝试过匹配,然后调用例如group()
并抓住IllegalStateException
?
我问这个是因为我使用Matcher
作为成员,并且不想在其他成员中重复这些信息,因为它不必要地破坏了这个类。
答案 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。匹配器的显式状态由每个匹配操作重新计算。”