从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++。