原子组和非捕获组

时间:2011-06-27 05:32:07

标签: regex

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

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

  2. 是原子组还是非捕获 组,代表(?:expr), 同样的事情?
  3. 请注意,我并不仅限于一种特殊的Regex风格。

3 个答案:

答案 0 :(得分:7)

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

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

例如,正则表达式a(?:bc|b)c匹配abccabc(未捕获匹配项),而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'会失败。

正如其他人所说,在其他情况下,您可能希望避免回溯,即使它对最终比赛没有影响,也可以优化正则表达式。