原子组和非捕获组

Tim*_*Tim 7 regex

  1. 我想知道如何理解原子团,表示为(?>expr)?它是干什么用的?

    http://www.regular-expressions.info/atomic.html中,唯一的例子是何时expr交替,例如正则表达式 a(?>bc|b)c匹配abcc但不是 abc.有expr没有交替的例子 吗?

  2. 原子组和非捕获组是否表示(?:expr)相同?

请注意,我并不仅限于一种特殊的Regex风格.

小智 7

1)当使用Atomic组时,如果没有为给定字符串匹配完整的正则表达式,则正则表达式引擎将不会回溯进一步的排列.无论何时使用交替,如果匹配成功,正则表达式将立即尝试匹配表达式的其余部分,但将跟踪其他可能的替换位置.如果表达式的其余部分不匹配,则正则表达式将返回到先前提到的位置并尝试其他组合.如果原子团已经被使用,正则表达式引擎将不会一直保持跟踪先前位置,而且只会放弃匹配.上面的例子并没有真正解释使用Atomic组的目的.它只是清楚地证明了回溯的消除.原子组将在使用贪婪量词的某些场景中使用,并且即使没有交替也可以进一步组合.

2)原子团和非捕获团是不同的.非捕获组根本不保存匹配的值.如果需要进一步的组合,原子组只是禁用回溯.

例如,正则表达式a(?:bc|b)c匹配两者abccabc(不捕获匹配),而a(?>bc|c)c只匹配abcc.如果正则表达式是a(?>b|bc)c,它只匹配abc,而a(?:b|bc)c仍然匹配两者.

  • 不要忘记,Atomic组也是非捕获的! (3认同)

Den*_*rdy 5

原子组(以及所有格修饰符)可用于避免灾难性的回溯 - 恶意用户可利用这些回溯通过吞噬服务器的内存来触发拒绝服务攻击.

非捕获组只是 - 非捕获组.正则表达式引擎可以回溯到非捕获组; 不是原子团体.