什么是正则表达式“独立非捕获组”?
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
(捕获组)匹配abcc和abc。正则表达式 a(?>bc|b)c
(原子组)匹配 abcc 但不匹配 abc。
当应用于 abc 时,两个正则表达式都将a
匹配到 a,bc
匹配到 bc,然后匹配 c
将无法在字符串末尾匹配。他们的道路在这里分道扬镳。具有捕获组 的正则表达式已记住交替的回溯位置。该组将放弃其匹配,b
然后匹配 b 和 c
匹配 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)+ +.以上是关于什么是正则表达式“独立非捕获组”?的主要内容,如果未能解决你的问题,请参考以下文章