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