相关疑难解决方法(0)

当没有调用"匹配"方法时,Matcher抛出IllegalStateException的原理

TL; DR

MatcherAPI 背后的设计决策是什么?

背景

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"));
Run Code Online (Sandbox Code Playgroud)

这段代码抛出一个

java.lang.IllegalStateException: No match found
Run Code Online (Sandbox Code Playgroud)

(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"));
Run Code Online (Sandbox Code Playgroud)

将呼叫添加到matches()at (2)将设置Matcher为正确的调用状态group().

问题,可能不具有建设性

为什么这个API设计得像这样?为什么不在构建时自动匹配?MatcherPatter.matcher(String)

java regex illegalstateexception

28
推荐指数
2
解决办法
7829
查看次数

标签 统计

illegalstateexception ×1

java ×1

regex ×1