原子团和非原子团
我想知道如何理解原子组,表示为(?>expr)
? 它是干什么用的?
在http://www.regular-expressions.info/atomic.html中,唯一的例子是当expr
被替换时,比如正则表达式a(?>bc|b)c
匹配abcc
但不匹配abc
。 expr
没有被替换的例子吗?
(?:expr)
表示的相同的东西吗? 请注意,我并不仅限于一种特定的正则表达式。
1)当使用原子组时,如果完整的正则表达式对于给定的字符串没有匹配,则正则表达式引擎将不会为了进一步的排列而回溯。 无论何时使用替换,如果匹配成功,则正则表达式将立即尝试匹配表达式的其余部分,但会跟踪其他替换可能的位置。 如果表达式的其余部分不匹配,则正则表达式将返回到前面提到的位置并尝试其他组合。 如果使用原子分组,则正则表达式引擎不会跟踪以前的位置,只会放弃匹配。 上面的例子并没有真正解释使用原子组的目的。 它只是清楚地表明消除了回溯。 在使用贪婪量词的某些情况下,原子组可能会有用,即使没有变化,也可能有更多组合。
2)原子团体和非捕获团体是不同的。 非捕获组不会保存匹配的值。 在需要进一步组合的情况下,原子组只需禁用回溯。
例如,正则表达式a(?:bc|b)c
匹配abcc
和abc
(不捕获匹配),而a(?>bc|c)c
只匹配abcc
。 如果正则表达式是a(?>b|bc)c
,它只会匹配abc
,而a(?:b|bc)c
仍然会匹配两者。
原子组(和所有格修饰符)对于避免灾难性的回溯是有用的 - 这可以被恶意用户利用来通过吞噬服务器的内存来触发拒绝服务攻击。
非捕获组就是这样 - 不捕获。 正则表达式引擎可以回溯到非捕获组; 不是原子团体。
链接地址: http://www.djcxy.com/p/74837.html上一篇: Atomic group and non
下一篇: Different regex behaviour in web page and Chrome extension