【问题标题】:Regex: ?: notation (Question mark and colon notation) [duplicate]正则表达式:?:表示法(问号和冒号)[重复]
【发布时间】:2012-07-16 20:50:04
【问题描述】:

我有以下 Java 正则表达式,不是我写的,我正在尝试修改:

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

类似于this one

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

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

【问题讨论】:

  • The question mark and the colon after the opening round bracket are the special syntax that you can use to tell the regex engine that this pair of brackets should not create a backreferenceregular-expressions.info/brackets.html

标签: java regex


【解决方案1】:

(?: 启动一个非捕获组。这与( 没有什么不同,除非您在使用后从正则表达式中检索组。见What is a non-capturing group? What does a question mark followed by a colon (?:) mean?

【讨论】:

  • 我猜这也更有效率,因为它不需要将组保存在内存中以供反向引用使用...
  • 更多信息:) 后面的?(?: 无关。第二个? 表示非捕获组是可选的。
  • Thomas N:是的,效率更高一点。但如此之少,它可能并不重要。如果考虑效率,最好手动编码操作而不是使用正则表达式,而不是接受捕获组与非捕获组的效率增益。 IMO,是否使用捕获与非捕获的决定应该简单地记录表达式的意图。
【解决方案2】:

这个帖子有点晚了 - 只是为了建立 ryanp 的回答。

假设你有字符串aaabbbccc

正则表达式

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

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

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

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

在第一组中使用?:

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

你会得到以下匹配的组:

['b', 'c']

因此称为“非捕获括号”

示例用例:

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

"New (York|Jersey)"

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

"New (?:York|Jersey)"

【讨论】:

  • 在添加子组以进行量化时也非常有用,因此您无需修改​​反向引用。
  • 我喜欢这个示例“New (?:York|Jersey)”,因为它提供了您想要使用非捕获组的理由。
  • @Donato 您能否用简单的英语翻译这个“New (?:York|Jersey)”示例。是说不匹配约克或泽西吗?或匹配泽西岛,但约克。谢谢!
  • @NikhilG:都没有!它说:“匹配 York 或 Jersey,但不要捕获匹配的数据”。
  • 所以你只想捕获New
猜你喜欢
  • 1970-01-01
  • 2013-05-04
  • 2021-03-12
  • 2013-01-26
  • 2019-01-07
  • 2020-04-11
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
相关资源
最近更新 更多