63

来自 Java 6模式文档:

特殊构造(非捕获)

(?:X )   X,作为非捕获组

…</p>

(?>X )   X,作为一个独立的非捕获组

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

4

4 回答 4

49

这意味着分组是原子的,它会丢弃匹配组的回溯信息。所以,这个表达是所有格;即使这样做是整个正则表达式成功的唯一方法,它也不会退缩。它是“独立的”,因为它不通过回溯与正则表达式的其他元素合作以确保匹配。

于 2008-09-08T20:16:09.667 回答
9

我认为本教程解释了“独立、非捕获组”或“原子分组”到底是什么

正则表达式a(bc|b)c(捕获组)匹配abccabc。正则表达式a(?>bc|b)c(原子组)匹配abcc但不匹配abc

当应用于abc时,两个正则表达式都将匹配aa,匹配bcbc,然后c在字符串的末尾将无法匹配。他们的道路在这里分道扬镳。带有捕获组的正则表达式已经记住了交替的回溯位置。该组将放弃其匹配,b然后匹配bc匹配c。找到匹配!

但是,带有atomic group的正则表达式在bc匹配后从原子组中退出。此时,组内令牌的所有回溯位置都将被丢弃。b在此示例中,将放弃在字符串中的第二个位置尝试的替代选项。结果,当c失败时,正则表达式引擎没有可供尝试的替代方案。

于 2018-05-03T03:31:47.983 回答
6

如果你有foo(?>(co)*)co,那将永远不会匹配。我确信有实际示例说明何时有用,请尝试 O'Reilly 的书。

于 2008-12-26T21:22:14.660 回答
-2

(?>X?) 等于 (?:X)?+, (?>X*) 等于 (?:X)*+, (?>X+) 等于 (?:X)++。

编辑: 上面的“语法”意味着: (?>X?)equals (?:X)?+(?>X*)equals (?:X)*+(?>X+)equals (?:X)++

除去 X 必须是非捕获组的事实,前面的等价是:

(?>X?)等于X?+(?>X*)等于X*+(?>X+)等于X++

于 2015-02-22T22:19:22.497 回答