使用Pattern / Matcher的IllegalStateException

时间:2014-12-04 18:42:47

标签: java regex

我使用Matcher在Java中使用正则表达式捕获组,并且即使我知道表达式匹配,它仍然会抛出IllegalStateException

这是我的代码:

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

我希望safeName与正则表达式中的捕获组一起捕获.ca,但我得到:

  

IllegalStateException:找不到匹配项

我还尝试使用.group(0).group(1),但同样的错误发生了。

根据group()group(int group)的文档:

  

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

我做错了什么?

1 个答案:

答案 0 :(得分:5)

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

因此,在您使用group之前,您需要让Matcher迭代您的字符串以匹配您的正则表达式find()。要检查正则表达式是否与整个字符串匹配,我们可以使用matches()方法而不是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;