什么是正则表达式“独立非捕获组”?

Posted

技术标签:

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

来自 Java 6 Pattern 文档:

特殊构造(非捕获)

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

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

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

【问题讨论】:

【参考方案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)+ +.

以上是关于什么是正则表达式“独立非捕获组”?的主要内容,如果未能解决你的问题,请参考以下文章

php正则表达式是啥?

什么时间用正则表达式什么时间用json提取器

正则表达式与文件格式化处理

正则表达式

什么是正则表达式

什么是 '?-mix' 在 Ruby 正则表达式中