正则expression式:问号和冒号

我有以下的Java正则expression式,我没有写,我试图修改:

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

这和这个很像

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

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

(?:启动一个非捕获组,这与之前没有区别(除非你在使用后从正则expression式中检索组),请参阅什么是非捕获组?问号后面跟冒号(?:)是什么意思?

有点迟到这个线程 – 只是build立在ryanp的答案。

假设你有stringaaabbbccc

正则expression式

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

这会给你以下3个匹配的组:

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

正则expression式与非捕获括号

在第一组中使用?:

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

你会得到以下匹配的组:

 ['b', 'c'] 

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

示例用例:

有时你用括号来做其他事情。 例如设置|的边界 或运营商:

 "New (York|Jersey)" 

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

 "New (?:York|Jersey)"