正则表达式和捕获括号

时间:2014-11-21 20:44:16

标签: java regex parentheses capturing-group

我试图理解捕获括号是如何为正则表达式工作的,但是我没有得到它......

我的代码是:

   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

为什么?

1 个答案:

答案 0 :(得分:3)

来自Matcher#group()的javadoc:

  

捕获组从左到右编制索引,从一个开始。组零表示整个模式,因此表达式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组。