Java 正则中的非捕获组

本贴最后更新于 550 天前,其中的信息可能已经事过境迁

正则表达式中的非捕获组(non-capturing group)用于匹配但不“保存”匹配结果,出现在正则表达式模式中的 (?:pattern) 这部分就是非捕获组。

我试了几个在线的正则表达式测试工具,返回的匹配结果都是“整个组”,不是非捕获组。

imagepng

Java 中 Matcher#group() 返回的是 group(0),也是整个匹配结果,如果要返回第一个非捕获组,需要用 group(1)

Pattern pattern = Pattern.compile("([0-9]+)(?:st|nd|rd|th)?");
Matcher matcher = pattern.matcher("1st 2nd 3 4th");
while (matcher.find()) {
    System.out.printf("%3s %s\n", matcher.group(), matcher.group(1));
}

输出:

1st 1
2nd 2
  3 3
4th 4

另外,使用非捕获组时需要注意结尾的 ?,在上面例子中 ([0-9]+)(?:st|nd|rd|th)? 说明该非捕获组是可选的,如果缺少该 ?,则输出结果:

1st 1
2nd 2
4th 4

因为 3 没有 st|nd|rd|th 结尾,所以没有匹配上。

非捕获组的概念很好理解,在 Java 中获取非捕获组也很简单,但在需要替换匹配的场景下,不能使用非捕获组,因为 Matcher#appendReplacementMatcher#appendTail 或者 Matcher#replace* 并不支持非捕获组替换。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    2625 引用 • 8025 回帖 • 774 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    24 引用 • 88 回帖
1 回帖
请输入回帖内容...