正则表达式:?:表示法(问号和冒号)

时间:2012-07-17 21:04:32

标签: java regex

我有以下Java正则表达式,我没有写,我正在尝试修改:

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

this one类似。

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

正则表达式编译得很好,并且已经有JUnit测试显示它是如何工作的。只是我对第一个问号和冒号的原因感到有点困惑。

2 个答案:

答案 0 :(得分:128)

(?:启动非捕获组。除非您在使用后从正则表达式中检索组,否则它与(没有区别。请参阅What is a non-capturing group? What does a question mark followed by a colon (?:) mean?

答案 1 :(得分:39)

这个帖子有点晚 - 只是建立在ryanp的答案上。

假设你有字符串aaabbbccc

正则表达式

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

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

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

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

使用第一组中的?:

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

您将获得以下匹配的组:

['b', 'c']

因此,为什么称它为" 非捕获括号"

示例用例:

有时你用括号做其他事情。例如,设置|或运算符的边界:

"New (York|Jersey)"

在这种情况下,您只使用或|开关的括号,并且您并不真正想要捕获此数据。使用非捕获括号表示:

"New (?:York|Jersey)"