来自 Java 6模式文档:
特殊构造(非捕获)
(?:
X)
X,作为非捕获组…</p>
(?>
X)
X,作为一个独立的非捕获组
之间(?:X)
有(?>X)
什么区别?在这种情况下,独立意味着什么?
这意味着分组是原子的,它会丢弃匹配组的回溯信息。所以,这个表达是所有格;即使这样做是整个正则表达式成功的唯一方法,它也不会退缩。它是“独立的”,因为它不通过回溯与正则表达式的其他元素合作以确保匹配。
我认为本教程解释了“独立、非捕获组”或“原子分组”到底是什么
正则表达式a(bc|b)c
(捕获组)匹配abcc和abc。正则表达式a(?>bc|b)c
(原子组)匹配abcc但不匹配abc。
当应用于abc时,两个正则表达式都将匹配a
到a,匹配bc
到bc,然后c
在字符串的末尾将无法匹配。他们的道路在这里分道扬镳。带有捕获组的正则表达式已经记住了交替的回溯位置。该组将放弃其匹配,b
然后匹配b并c
匹配c。找到匹配!
但是,带有atomic group的正则表达式在bc
匹配后从原子组中退出。此时,组内令牌的所有回溯位置都将被丢弃。b
在此示例中,将放弃在字符串中的第二个位置尝试的替代选项。结果,当c
失败时,正则表达式引擎没有可供尝试的替代方案。
如果你有foo(?>(co)*)co
,那将永远不会匹配。我确信有实际示例说明何时有用,请尝试 O'Reilly 的书。
(?>X?) 等于 (?:X)?+, (?>X*) 等于 (?:X)*+, (?>X+) 等于 (?:X)++。
编辑:
上面的“语法”意味着:
(?>X?)
equals (?:X)?+
,(?>X*)
equals (?:X)*+
,(?>X+)
equals (?:X)++
。
除去 X 必须是非捕获组的事实,前面的等价是:
(?>X?)
等于X?+
,(?>X*)
等于X*+
,(?>X+)
等于X++
。