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

BJ *_*ruz 92 java regex

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

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

它与类似.

注意第一个问号.这是否意味着该组是可选的?对应之后已有问号).结肠在正则表达式中有特殊意义吗?

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

rya*_*anp 135

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

  • 更多信息:```````与`(?:`.无关.第二个`?`表示非捕获组是可选的. (6认同)

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)

  • 我喜欢这个例子"New(?:York | Jersey)",因为它提供了你想要使用非捕获组的原因. (3认同)
  • @Donato 你能用简单的英语翻译这个“New (?:York|Jersey)”示例吗?是说不匹配约克或泽西吗?或匹配泽西岛但匹配约克。谢谢! (3认同)
  • @NikhilG:都不是!它说:“匹配约克或泽西岛,但不捕获匹配的数据”。 (3认同)
  • 所以你只想捕获“New”。 (2认同)