【发布时间】:2010-09-08 05:01:20
【问题描述】:
来自 Java 6 Pattern 文档:
特殊构造(非捕获)
(?:X)X,作为非捕获组…
(?>X)X,作为一个独立的非捕获组
(?:X) 和(?>X) 之间有什么区别?在这种情况下,独立是什么意思?
【问题讨论】:
来自 Java 6 Pattern 文档:
特殊构造(非捕获)
(?:X)X,作为非捕获组…
(?>X)X,作为一个独立的非捕获组
(?:X) 和(?>X) 之间有什么区别?在这种情况下,独立是什么意思?
【问题讨论】:
表示分组为atomic,并丢弃匹配组的回溯信息。所以,这个表达是所有格;即使这样做是整个正则表达式成功的唯一方法,它也不会退缩。它是“独立的”,因为它不通过回溯与正则表达式的其他元素合作以确保匹配。
【讨论】:
我认为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 失败时,正则表达式引擎没有可供尝试的替代方案。
【讨论】:
如果你有foo(?>(co)*)co,那将永远不会匹配。我敢肯定有一些实际示例说明这在什么时候有用,请尝试 O'Reilly 的书。
【讨论】:
(?>X?) 等于 (?:X)?+, (?>X*) 等于 (?:X)*+, (?>X+) 等于 (?:X)++。
编辑:
上面的“语法”意味着:
(?>X?) 等于 (?:X)?+,(?>X*) 等于 (?:X)*+,(?>X+) 等于 (?:X)++。
除去 X 必须是非捕获组的事实,前面的等价是:
(?>X?) 等于X?+,(?>X*) 等于X*+,(?>X+) 等于X++。
【讨论】:
independent 很重要。它们并不完全相同,因为(?>X) 在部分匹配失败时不会进行任何回溯,因此使用一个匹配的某些内容将无法使用另一个匹配。 article @erickson linked to was helpful for me.
[?/*/+] 与 [?+*/] 相同,并且是匹配 4 个字符(?、+、*、/)之一的 character class,并且在] 之后的+ 是一个greedy quantifier,它使字符类匹配一次或多次。您的正则表达式中的任何地方都没有possessive quantifier。