Java 什么是正则表达式;独立捕获组“;?

Java 什么是正则表达式;独立捕获组“;?,java,regex,Java,Regex,从Java 6文档中: 特殊构造(非捕获) (?:X)X,作为非捕获组 (?>X)X,作为一个独立的非捕获组 在(?:X)和(?>X)之间有什么区别?在这个上下文中,独立的是什么意思?它意味着分组是独立的,并且它丢弃了匹配组的回溯信息。所以,这个表达是所有格的;即使这样做是整个正则表达式成功的唯一途径,它也不会退缩。它是“独立”的,因为它不通过回溯与正则表达式的其他元素合作以确保匹配。如果您有foo(?>(co)*)co,则永远不会匹配。我相信这会有一些实用的例子,试试O'Reilly的书。(

从Java 6文档中:

特殊构造(非捕获)

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

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


(?:X)
(?>X)
之间有什么区别?在这个上下文中,独立的是什么意思?

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

如果您有
foo(?>(co)*)co
,则永远不会匹配。我相信这会有一些实用的例子,试试O'Reilly的书。

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

编辑: 上面的“语法”是指:
(?>X?
等于
(?:X)+
(?>X*)
等于
(?:X)*++
(?>X+
等于
(?:X)+

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

(?>X?
等于
X++
(?>X*)
等于
X*++
(?>X+)
等于
X++
,我想这解释了什么是“独立的、非捕获的群”或“原子群”

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

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


然而,在匹配了
bc
之后,带有原子组的正则表达式退出了原子组。此时,组内令牌的所有回溯位置都将被丢弃。在本例中,在字符串的第二个位置尝试
b
的替代选项将被放弃。因此,当
c
失败时,regex引擎没有其他选择可供尝试。

中的
independent
一词很重要。它们并不完全相同,因为当部分匹配失败时,
(?>X)
不会进行任何回溯,因此使用其中一个匹配的部分将不会使用另一个匹配。对不起,我现在不太喜欢这个,所以我的答案可能不准确。但从你自己的参考资料来看:“其中大多数还支持所有格量词,这本质上是原子分组的一种符号便利。”这就是我想要表达的。在后一种情况下,附加的“+”字符表示所有格限定符。
[?/*/+]
[?+*/]
相同,并且是4个字符(
+
*
/
)中的一个匹配字符,而
+
后面的
+
是使字符类匹配一次或多次的。正则表达式中没有任何地方。(?>X?)等于(?:X)?+,(?>X*)等于(?:X)*+,(?>X+)等于(?:X)++。