106

我有以下 Java 正则表达式,它不是我写的,我正在尝试修改:

^class-map(?:(\\s+match-all)|(\\s+match-any))?(\\s+[\\x21-\\x7e]{1,40})$
           ^                                 ^

它与类似。

注意第一个问号。这是否意味着该组是可选的?对应的后面已经有一个问号了)。冒号在正则表达式中有特殊含义吗?

正则表达式编译得很好,并且已经有 JUnit 测试显示它是如何工作的。只是我有点困惑为什么第一个问号和冒号在那里。

4

2 回答 2

156

(?:启动一个非捕获组。(除非您在使用后从正则表达式中检索组,否则这没有什么不同。请参阅什么是非捕获组?问号后跟冒号 (?:) 是什么意思?.

于 2012-07-17T21:06:22.370 回答
50

这个线程有点晚了 - 只是为了建立 ryanp 的答案。

假设你有字符串aaabbbccc

正则表达式

(a)+(b)+(c)+

这将为您提供以下 3 个匹配的组:

['a', 'b', 'c']

带有非捕获括号的正则表达式

?:在第一组中使用

(?:a)+(b)+(c)+

你会得到以下匹配的组:

['b', 'c']

因此为什么它被称为“非捕获括号”

示例用例:

有时您将括号用于其他事情。例如设置|or 运算符的边界:

"New (York|Jersey)"

在这种情况下,您只使用括号来表示 or|开关,并且您并不想捕获这些数据。使用非捕获括号表示:

"New (?:York|Jersey)"
于 2015-04-29T02:51:48.677 回答