我有以下Java正则表达式,我没有写,我正在尝试修改:
^class-map(?:(\\s+match-all)|(\\s+match-any))?(\\s+[\\x21-\\x7e]{1,40})$
^ ^
与this one类似。
请注意第一个问号。这是否意味着该组是可选的?相应的)
后面已经有一个问号。冒号在正则表达式中有特殊含义吗?
正则表达式编译得很好,并且已经有JUnit测试显示它是如何工作的。只是我对第一个问号和冒号的原因感到有点困惑。
答案 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)"