我想知道如何理解原子團,表示爲
(?>expr)
?什麼是 用於?原子團和非捕獲組在 http://www.regular-expressions.info/atomic.html, 唯一的例子是當
expr
是 交替,如正則表達式a(?>bc|b)c
匹配abcc
但不abc
。expr
是否有變化?- 是原子組還是非捕獲組 組,表示爲
(?:expr)
, 是同樣的東西嗎?
請注意,我並不僅限於一種特定的正則表達式。
我想知道如何理解原子團,表示爲(?>expr)
?什麼是 用於?原子團和非捕獲組
在 http://www.regular-expressions.info/atomic.html, 唯一的例子是當expr
是 交替,如正則表達式 a(?>bc|b)c
匹配abcc
但不 abc
。 expr
是否有變化?
(?:expr)
, 是同樣的東西嗎?請注意,我並不僅限於一種特定的正則表達式。
原子組(和possessive modifier)對於避免catastrophic backtracking有用 - 它可以被惡意用戶利用通過吞噬服務器的內存來觸發拒絕服務攻擊。
非捕獲組就是這樣 - 非捕獲。正則表達式引擎可以回溯到非捕獲組;不是原子團體。
1)當使用原子組時,如果完整的正則表達式沒有匹配給定的字符串,那麼正則表達式引擎將不會回溯到進一步的排列。無論何時使用替換,如果匹配成功,則正則表達式將立即嘗試匹配表達式的其餘部分,但會跟蹤其他替換可能的位置。如果表達式的其餘部分不匹配,則正則表達式將返回到前面提到的位置並嘗試其他組合。如果原子分組已經使用了,則正則表達式引擎而不是已經保持跟蹤之前的位置並且剛剛放棄了匹配。上面的例子並沒有真正解釋使用原子組的目的。它只是清楚地表明消除了回溯。在使用貪婪量詞的某些情況下,原子組可能會有用,即使沒有變化,也可能有更多組合。 2)原子組和非捕獲組是不同的。非捕獲組不會保存匹配的值。在需要進一步組合的情況下,原子組只需禁用回溯。
例如,正則表達式匹配a(?:bc|b)c
既abcc
和abc
(而不捕獲匹配),而a(?>bc|c)c
僅匹配abcc
。如果正則表達式爲a(?>b|bc)c
,它只會匹配abc
,而a(?:b|bc)c
仍然會匹配兩者。
不要忘記,原子團體也不會被捕獲! – robinCTS
謝謝!原子組和佔有性修飾符之間有什麼區別?他們是否爲了相同的目的? – Tim
所有格修飾符只是語法上的語法糖:'(?:a | b)* +'相當於'(?>(?: a | b)*)'。 –