简单的java正则表达式抛出illegalstateexception

时间:2013-08-15 16:52:46

标签: java regex illegalstateexception

我试图快速进行健全检查......而且它失败了。这是我的代码 -

import java.util.regex.*;

public class Tester {
    public static void main(String[] args) {
        String s = "a";
        Pattern p = Pattern.compile("^(a)$");
        Matcher m = p.matcher(s);
        System.out.println("group 1: " +m.group(1));
    } 
}

我期望看到group 1: a。但相反,我得到IllegalStateException: no match found,我不明白为什么。

编辑:我也尝试打印groupCount(),它说有1。

3 个答案:

答案 0 :(得分:11)

您需要先调用m.find()m.matches()才能使用m.group

  • find可用于查找与您的模式匹配的每个子字符串(主要用于存在多个匹配的情况)
  • matches会检查整个字符串是否与您的模式匹配,因此您甚至无需在模式中添加^$

我们也可以使用m.lookingAt()但是现在让我们跳过它的描述(你可以在文档中阅读)。

答案 1 :(得分:4)

在调用Matcher.group(int)

之前使用Matcher#matchesMatcher#find
if (m.find()) {
   System.out.println("group 1: " +m.group(1));
}

在这种情况下,Matcher#find更合适,因为Matcher#matches匹配完整的String(使得匹配表达式中的锚字符多余)

答案 2 :(得分:2)

查看Matcher的{​​{3}}。您将看到“在成功匹配之前尝试查询它的任何部分将导致抛出IllegalStateException”。

使用group(1)传送if (matcher.find()) {}来电来解决此问题。