当前位置: 首页 > 知识库问答 >
问题:

当没有调用“matching”方法时匹配器抛出IllegalStateException的基本原理

姜泳
2023-03-14

DR

matcher的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"));

(2)处添加对matches()的调用,可将匹配器设置为调用group()的正确状态。

共有1个答案

勾长卿
2023-03-14

实际上,你误解了文档。再看一下你引用的声明:-

试图在匹配成功之前查询它的任何部分将导致引发IllegalStateException。

如果没有找到匹配,匹配器可能会在访问matcher.group()时抛出IlegalStateException

 - matcher.matches() //Or
 - matcher.find()
Matcher matcher = pattern.matcher();  
if (matcher.matches()) {
    // Then use `matcher.group()`
}

如果if中的条件返回false,则表示没有匹配。因此,如果使用matcher.group(),而不检查此条件,则如果没有找到匹配项,则将获得IllegalStateException

假设,如果matcher按您所说的方式设计,那么您必须执行null检查以检查是否找到匹配项,并调用matcher.group(),如下所示:-

你认为应该这样做:-

// Suppose this returned the matched string
Matcher matcher = pattern.matcher(s);  

// Need to check whether there was actually a match
if (matcher != null) {  // Prints only the first match

    System.out.println(matcher.group());
}

所以,实际上是这样的:-

Matcher matcher = pattern.matcher(s);

   // Finds all the matches until found by moving the `matcher` forward
while(matcher.find()) {
    System.out.println(matcher.group());
}

因此,如果在字符串中找到4个匹配项,第一种方法只打印第一个,而第二种方法将打印所有匹配项,方法是将匹配器向前移动以匹配下一个模式。

我希望这能说明问题。

不幸的是,我无法找到任何其他官方来源,明确说明为什么和如何解决这个问题。

 类似资料:
  • 问题内容: TL; DR MatcherAPI 的设计决策是什么? 背景 Matcher有我意想不到的行为,而我找不到很好的理由。API文档说: 创建后,可以使用匹配器执行三种不同类型的匹配操作:这些方法中的每一个都返回一个指示成功或失败的布尔值。通过查询匹配器的状态,可以获得有关成功匹配的更多信息。 API文档进一步说明了: 匹配器的显式状态最初是不确定的。在成功匹配之前尝试查询它的任何部分都将

  • 问题内容: 我使用Java中的正则表达式来捕获组,即使我知道表达式匹配,它也会不断抛出一个。 这是我的代码: 我期待是因为在正则表达式的捕获组拍摄的,而是我得到: IllegalStateException:找不到匹配项 我也尝试过,但发生相同的错误。 根据该文件,并: 捕获组从左到右从一个索引开始。零组表示整个模式,因此表达式等于。 我究竟做错了什么? 问题答案: 是帮助程序类,它处理数据迭代以

  • 让我们从Javadocs开始: 非法国家例外 表示在非法或不适当的时间调用了方法。换句话说,Java环境或Java应用程序对于请求的操作没有处于适当的状态。 异常 抛出以指示方法已传递非法或不适当的参数。 上面的问题是,它们非常黑白分明。考虑一个用例,其中方法正在解析调用方提供的文件。该文件存在、可读且格式正确。但是,文件中的某些内容不符合业务规则。在这种情况下,什么是合适的异常抛出-或? 看看提

  • 在函数值和闭包之后,模式匹配是Scala中使用次数最多的第二个特性。 Scala在处理消息时为模式匹配提供了很好的支持。 模式匹配包括一系列备选方案,每个备选方案都以关键字case开头。 每个替代方案都包括一个pattern和一个或多个expressions ,如果模式匹配,将对其进行评估。 箭头符号=“将模式与表达式分开。 请尝试以下示例程序,该程序显示如何匹配整数值。 例子 (Example)