TL;博士
Matcher
的 API背后的设计决策是什么?
背景
Matcher
有一种我没有预料到的行为,而且我找不到很好的理由。API 文档说:
创建后,匹配器可用于执行三种不同类型的匹配操作: [...] 这些方法中的每一个都返回一个布尔值,指示成功或失败。更多关于匹配成功的信息可以通过查询匹配器的状态来获得。
API 文档进一步说的是:
匹配器的显式状态最初是未定义的;在成功匹配之前尝试查询它的任何部分将导致抛出 IllegalStateException。
例子
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)