栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

实际上,你误解了文档。再来看一下你引用的语句:

在成功匹配之前尝试查询它的任何部分都将引发

IllegalStateException

如果找不到匹配项,则匹配器可能会抛出

IllegalStateException
访问错误
matcher.group()

因此,你需要使用以下测试来实际启动匹配过程:-

 - matcher.matches() //Or - matcher.find()

下面的代码:

Matcher matcher = pattern.matcher();  

只需创建一个matcher实例。这实际上不会匹配字符串。即使比赛成功。因此,你需要检查以下情况,以检查是否成功匹配:

if (matcher.matches()) {    // Then use `matcher.group()`}

而如果在条件if回报false,这意味着什么也没有匹配。因此,如果你在

matcher.group()
不检查此条件的情况下使用,将获得
IllegalStateException
未找到匹配项的信息。

假设,如果

Matcher
按照你所说的方式设计,那么你将必须进行null检查以检查是否找到了匹配项,以致电
matcher.group()
,如下所示:

你认为应该完成的方式:

// Suppose this returned the matched stringMatcher matcher = pattern.matcher(s);  // Need to check whether there was actually a matchif (matcher != null) {  // Prints only the first match    System.out.println(matcher.group());}

但是,如果要打印任何其他匹配项,该方法可以在字符串中多次匹配,那么该方法应该告诉匹配器找到下一个匹配项。但是

null
支票无法做到这一点。为此,你必须将匹配器向前移动以匹配下一个字符串。因此,在
Matcher
类中定义了多种方法来达到目的。该
matcher.find()
方法匹配字符串,直到找到所有匹配项。

还有其他方法,即

match
字符串以不同的方式取决于你的匹配方式。因此,它最终会在Matcher类上matching针对字符串进行处理。
Pattern
类只会创建一个
pattern
要匹配的对象。如果
Pattern.matcher()
match
使用模式,则必须有某种方法可以定义
to
的各种方法
match
,就像
matching
可以以不同的方式一样。因此,需要Matcher上课。

因此,实际上是这样的:

Matcher matcher = pattern.matcher(s);   // Finds all the matches until found by moving the `matcher` forwardwhile(matcher.find()) {    System.out.println(matcher.group());}

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

我希望这很清楚。

·类的文档描述了它提供的三种方法的用法,它们表示:-

通过调用模式的matcher方法从模式创建匹配器。创建匹配器后,可以使用匹配器执行三种不同类型的匹配操作:

  • matchs方法尝试将整个输入序列与模式进行匹配。

  • lookingAt方法尝试将输入序列从开头开始与模式进行匹配。

  • find方法扫描输入序列以查找与该模式匹配的下一个子序列。

不幸的是,我一直没能找到任何其他官方消息来源,说明确为什么和如何这个问题。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/404822.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号