【问题标题】:What is a regex "independent non-capturing group"?什么是正则表达式“独立非捕获组”?
【发布时间】:2010-09-08 05:01:20
【问题描述】:

来自 Java 6 Pattern 文档:

特殊构造(非捕获)

(?:X)   X,作为非捕获组

(?>X)   X,作为一个独立的非捕获组

(?:X)(?>X) 之间有什么区别?在这种情况下,独立是什么意思?

【问题讨论】:

    标签: java regex


    【解决方案1】:

    表示分组为atomic,并丢弃匹配组的回溯信息。所以,这个表达是所有格;即使这样做是整个正则表达式成功的唯一方法,它也不会退缩。它是“独立的”,因为它不通过回溯与正则表达式的其他元素合作以确保匹配。

    【讨论】:

      【解决方案2】:

      我认为this tutorial 解释了究竟什么是“独立、非捕获组”或“原子分组”

      正则表达式a(bc|b)c(捕获组)匹配abccabc。正则表达式 a(?>bc|b)c(原子组)匹配 abcc 但不匹配 abc

      当应用于 abc 时,两个正则表达式都将a 匹配到 abc 匹配到 bc,然后匹配 c将无法在字符串末尾匹配。他们的道路在这里分道扬镳。具有捕获组 的正则表达式已记住交替的回溯位置。该组将放弃其匹配,b 然后匹配 bc 匹配 c。找到匹配项!

      带有原子组的正则​​表达式在匹配bc 后退出原子组。此时,组内令牌的所有回溯位置都将被丢弃。在此示例中,替代选项在字符串中的第二个位置尝试b 被丢弃。因此,当c 失败时,正则表达式引擎没有可供尝试的替代方案。

      【讨论】:

        【解决方案3】:

        如果你有foo(?>(co)*)co,那将永远不会匹配。我敢肯定有一些实际示例说明这在什么时候有用,请尝试 O'Reilly 的书。

        【讨论】:

          【解决方案4】:

          (?>X?) 等于 (?:X)?+, (?>X*) 等于 (?:X)*+, (?>X+) 等于 (?:X)++。

          编辑: 上面的“语法”意味着: (?>X?) 等于 (?:X)?+(?>X*) 等于 (?:X)*+(?>X+) 等于 (?:X)++

          除去 X 必须是非捕获组的事实,前面的等价是:

          (?>X?) 等于X?+(?>X*) 等于X*+(?>X+) 等于X++

          【讨论】:

          • the Pattern JavaDocs 中的词 independent 很重要。它们并不完全相同,因为(?>X) 在部分匹配失败时不会进行任何回溯,因此使用一个匹配的某些内容将无法使用另一个匹配。 article @erickson linked to was helpful for me.
          • 对不起,我目前不感兴趣,所以我的回答可能不准确。但是根据您自己的参考:“其中大多数还支持所有格量​​词,这本质上是原子分组的符号便利。”这就是我试图表达的。在后一种情况下,附加的“+”字符表示所有格限定符。
          • [?/*/+][?+*/] 相同,并且是匹配 4 个字符(?+*/)之一的 character class,并且在] 之后的+ 是一个greedy quantifier,它使字符类匹配一次或多次。您的正则表达式中的任何地方都没有possessive quantifier
          • (?>X?) 等于 (?:X)?+, (?>X*) 等于 (?:X)*+, (?>X+) 等于 (?:X)+ +.
          猜你喜欢
          • 2011-03-31
          • 2018-09-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多