来自 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++。