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

2022-08-31 09:37:04

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

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

与此类似

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

正则表达式编译良好,并且已经有 JUnit 测试显示它是如何工作的。只是我对为什么第一个问号和冒号在那里有点困惑。


答案 1

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


答案 2

这个线程有点晚 - 只是为了建立在ryanp的答案之上。

假设您有字符串aaabbbccc

正则表达式

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

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

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

带非捕获括号的正则表达式

在第一组中使用?:

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

您将获得以下匹配的组:

['b', 'c']

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

示例用例:

有时,您将括号用于其他事情。例如,要设置 or 运算符的边界:|

"New (York|Jersey)"

在本例中,您只使用或 开关的括号,并且您并不真正想要捕获此数据。使用非捕获括号表示:|

"New (?:York|Jersey)"