我想知道如何理解原子团,用(?>expr)
表示?它是什么
用于?
在
http://www.regular-expressions.info/atomic.html,
唯一的例子是expr
时
交替,如正则表达式
a(?>bc|b)c
匹配abcc
但不匹配
abc
。有没有例子
expr
没有交替?
(?:expr)
,
同样的事情?请注意,我并不仅限于一种特殊的Regex风格。
答案 0 :(得分:7)
1)当使用Atomic组时,如果没有为给定字符串匹配完整的正则表达式,则正则表达式引擎不会回溯进一步的排列。无论何时使用交替,如果匹配成功,正则表达式将立即尝试匹配表达式的其余部分,但将跟踪其他可能的替换位置。如果表达式的其余部分不匹配,则正则表达式将返回到先前提到的位置并尝试其他组合。如果使用了Atomic分组 ,则正则表达式引擎不将跟踪之前的位置并且只是放弃了匹配。上面的例子并没有真正解释使用Atomic组的目的。它只是清楚地证明了回溯的消除。在使用贪婪量词的某些场景中,原子群将是有用的,即使没有交替,也可以进一步组合。
2)原子组和非捕获组是不同的。非捕获组根本不保存匹配的值。如果需要进一步组合,原子组只会禁用回溯。
例如,正则表达式a(?:bc|b)c
匹配abcc
和abc
(未捕获匹配项),而a(?>bc|c)c
仅匹配abcc
。如果正则表达式为a(?>b|bc)c
,则只会匹配abc
,而a(?:b|bc)c
仍会匹配两者。
答案 1 :(得分:5)
原子组(以及possessive modifier)对于避免catastrophic backtracking很有用 - 恶意用户可以通过吞噬服务器的内存来利用它来触发拒绝服务攻击。
非捕获组只是 - 非捕获组。正则表达式引擎可以回溯到非捕获组;不是原子团。
答案 2 :(得分:0)
要添加其他答案并回答您的问题,“是否有expr
没有交替的示例”,这是一个简单的示例。考虑以下模式:
(abc)?a
这会在“ abc”和“ abca”中找到一个匹配项。但是当可选部分变成原子时会发生什么呢?
(?>(abc)?)a
它不再在“ abc”中找到匹配项。它永远不会放弃'abc',所以最后一个'a'会失败。
正如其他人所说,在其他情况下,您可能希望避免回溯,即使它对最终比赛没有影响,也可以优化正则表达式。