关于java:什么是正则表达式“独立捕获组”?

关于java:什么是正则表达式“独立捕获组”?

What is a regex “independent capturing group”?

从Java 6模式文档中:

Special constructs (non-capturing)

(?:X)X, as a non-capturing group

(?>X)X, as an independent, non-capturing group

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


这意味着分组是原子的,并且丢弃了匹配组的回溯信息。因此,该表达式是所有格;即使这样做是正则表达式整体成功的唯一途径,它也不会退缩。它是"独立的",即它不会通过回溯与正则表达式的其他元素协作来确保匹配。


我认为本教程将说明确切的"独立,非捕获组"或"原子分组"是什么

正则表达式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++


推荐阅读