6

我试图做一个快速的健全性检查......它失败了。这是我的代码 -

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。

4

3 回答 3

14

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

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

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

于 2013-08-15T16:53:52.053 回答
4

在调用之前使用Matcher#matchesMatcher#findMatcher.group(int)

if (m.find()) {
   System.out.println("group 1: " +m.group(1));
}

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

于 2013-08-15T16:53:59.350 回答
3

查看.javaMatcher文档。您将看到“在成功匹配之前尝试查询它的任何部分将导致抛出 IllegalStateException”。

结束您的group(1)电话if (matcher.find()) {}以解决此问题。

于 2013-08-15T16:57:46.257 回答