我有以下Java正则表达式,我没有写,我试图修改:
^class-map(?:(\\s+match-all)|(\\s+match-any))?(\\s+[\\x21-\\x7e]{1,40})$
^ ^
Run Code Online (Sandbox Code Playgroud)
它与此类似.
注意第一个问号.这是否意味着该组是可选的?对应之后已有问号)
.结肠在正则表达式中有特殊意义吗?
正则表达式编译得很好,并且已经有JUnit测试显示它是如何工作的.只是我对第一个问号和冒号的原因感到有些困惑.
rya*_*anp 135
(?:
启动一个非捕获组.(
除非您在使用后从正则表达式中检索组,否则没有什么不同.请参阅什么是非捕获组?问号后跟冒号(?:)是什么意思?.
Mar*_*cny 41
这个帖子有点晚 - 只是建立在ryanp的答案上.
假设你有字符串 aaabbbccc
(a)+(b)+(c)+
Run Code Online (Sandbox Code Playgroud)
这将为您提供以下3组匹配:
['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)
使用?:
第一组中的
(?:a)+(b)+(c)+
Run Code Online (Sandbox Code Playgroud)
你会得到以下匹配的组:
['b', 'c']
Run Code Online (Sandbox Code Playgroud)
因此,为什么它被称为" 非捕获括号"
有时你用括号做其他事情.例如,设置|
or运算符的边界:
"New (York|Jersey)"
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您只使用括号或|
开关,而您实际上并不想捕获此数据.使用非捕获括号表示:
"New (?:York|Jersey)"
Run Code Online (Sandbox Code Playgroud)