小编典典

具有模式/匹配器的IllegalStateException

java

我使用MatcherJava中的正则表达式来捕获组,IllegalStateException即使我知道表达式匹配,它也会不断抛出一个。

这是我的代码:

String safeName = Pattern.compile("(\\.\\w+)$").matcher("google.ca").group();

我期待safeName.ca因为在正则表达式的捕获组拍摄的,而是我得到:

IllegalStateException:找不到匹配项

我也尝试过.group(0).group(1)但发生相同的错误。

根据该文件group(),并group(int group)

捕获组从左到右从一个索引开始。零组表示整个模式,因此表达式m.group(0)等于m.group()

我究竟做错了什么?


阅读 209

收藏
2020-11-30

共1个答案

小编典典

Matcher是帮助程序类,它处理数据迭代以搜索与正则表达式匹配的子字符串。整个字符串可能包含许多可以匹配的子字符串,因此通过调用group()您无法指定您对哪个实际匹配感兴趣。要解决此问题,Matcher允许您遍历所有匹配的子字符串,然后使用您感兴趣的零件。

因此,在使用前,group需要让Matcher遍历字符串以find()匹配正则表达式。要检查正则表达式是否匹配整个String,我们可以使用matches()method而不是find()

通常可以找到我们正在使用的所有匹配子字符串

Pattern p = Pattern.compiler("yourPattern");
Matcher m = p.matcher("yourData");
while(m.find()){
    String match = m.group();
    //here we can do something with match... 
}

由于您假设要查找的文本在字符串中(末尾)仅存在一次,因此不需要使用循环,但是简单的if(或条件运算符)应该可以解决您的问题。

Matcher m = Pattern.compile("(\\.\\w+)$").matcher("google.ca");
String safeName = m.find() ? m.group() : null;
2020-11-30