java - 正则表达式和捕获括号

标签 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

为什么?

最佳答案

来自 Matcher#group() 的 javadocs :

Capturing groups are indexed from left to right, starting at one. Group zero denotes the entire pattern, so the expression m.group(0) is equivalent to 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 组。

关于java - 正则表达式和捕获括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27070032/

相关文章:

Java - 检查带有附加 '&' 字符的匹配括号

java - OpenSuse 13.2 上的 Qt for Android

java - 如何使用 java 代码获取文本文件的最后 1 mb 数据?

javascript - 正则表达式转义空格和特殊字符

java - 使用 Java 处理负数时拆分数学表达式

.net - 在括号中格式化负数但不使用 $ 符号?

Emacs C-c } 命令和括号匹配检查

java - 如何使用 Apache POI 解密 .doc/docx 文件?

java - ConcurrentSkipListSet remove() 的问题

python - 在多个数组中打印值会出现困惑