Matcher 在没有调用“匹配”方法时抛出 IllegalStateException 的理由
TL;DR
Matcher
的API背后的设计决策是什么?
背景
Matcher
有一种我没有预料到的行为,我找不到一个很好的理由。API 文档说:
创建后,可以使用匹配器执行三种不同类型的匹配操作: [...]这些方法中的每一个都返回一个布尔值,指示成功或失败。可以通过查询匹配器的状态来获取有关成功匹配的详细信息。
API 文档进一步说明的是:
匹配器的显式状态最初是未定义的;在成功匹配之前尝试查询它的任何部分都将导致抛出非法状态异常。
例
String s = "foo=23,bar=42";
Pattern p = Pattern.compile("foo=(?<foo>[0-9]*),bar=(?<bar>[0-9]*)");
Matcher matcher = p.matcher(s);
System.out.println(matcher.group("foo")); // (1)
System.out.println(matcher.group("bar"));
此代码抛出一个
java.lang.IllegalStateException: No match found
在。要解决此问题,有必要调用 或其他方法,使 进入允许 的状态。以下工作原理:(1)
matches()
Matcher
group()
String s = "foo=23,bar=42";
Pattern p = Pattern.compile("foo=(?<foo>[0-9]*),bar=(?<bar>[0-9]*)");
Matcher matcher = p.matcher(s);
matcher.matches(); // (2)
System.out.println(matcher.group("foo"));
System.out.println(matcher.group("bar"));
将对 matches() at 的
调用设置为要调用 的正确状态。(2)
Matcher
group()
问题,可能没有建设性
为什么这个 API 是这样设计的?为什么不在 构建时使用 自动匹配 ?Matcher
Patter.matcher(String)