1

我试图了解捕获括号如何为正则表达式工作,但我不明白......

我的代码是:

   Pattern pattern = Pattern.compile("ab");
   Matcher m = pattern.matcher("abc");

  while (m.find()) { 
      for (int i = 0; i < m.groupCount(); i++) {
          System.out.println(m.group(i));
      }
  }

所以我根本没有显示。我的理解是我需要一个捕获括号来记住匹配结果并显示它。

所以我做了 :

   Pattern pattern = Pattern.compile("(ab)");
   Matcher m = pattern.matcher("abc");

我得到了预期的显示:ab

然后我想记住并只显示匹配结果的一部分,所以我做了:

   Pattern pattern = Pattern.compile("(a)b");
   Matcher m = pattern.matcher("abc");

我期待有:a,但我有:ab

为什么 ?

4

1 回答 1

3

来自的javadocs Matcher#group()

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

问题是组零(即m.group(0))匹配整个模式,而不是捕获括号内的那个。所以要匹配你想要的组,你需要从索引 1 开始,直到组数结束:

for (int i = 1; i <= m.groupCount(); i++) {
    System.out.println(m.group(i));
}

就您而言,您只有一组。但是如果你有类似的东西Pattern.compile("(a)(b)"),那么(a)将匹配第 1 组并(b)匹配第 2 组。

于 2014-11-21T20:49:36.930 回答