代码之家  ›  专栏  ›  技术社区  ›  Adrian

一个被量化的原子群是否意味着与一个被量化的原子群相同?

  •  4
  • Adrian  · 技术社区  · 7 年前

    我在看 this answer 关于这个问题: Regex nested parentheses ,并认为 (?> list | of | alternates )* 它应该是一个原子量化的群体 (?> (?: list | of | alternates )* ) . 我错了吗?在正则表达式的世界中,它们是相同的还是不同的?尤其是在以下方面。NET实现?

    我个人认为它们不同,我通常使用perl正则表达式,它可以转换为 (?: list | of | alternates )*+ . 无论如何,这对我来说要清楚得多,说明如果需要,我想在这个特定的正则表达式之前回溯(一个原子量化组)。然而,也许这是作为一个设计决策来实现的,其思路是量化的原子群是没有用的?

    1 回复  |  直到 7 年前
        1
  •  3
  •   user557597 user557597    7 年前

    当一个原子群被称为独立表达式时,
    回溯确实发生在它的内部,就像其他任何地方一样。

    不同之处在于,原子组无法控制回溯
    外部机构。

    所以,一个原子群的每一次量化传递只对 仅有一个的
    不会导致回溯的实例。

    但是,如果将量词放在集群组上 在…内 a非量化
    原子组,影响是整个内容不会影响
    外部回溯。

    粒度很重要。

    实例

    (?>a|b|c)*abc 将匹配 aaaaaabbbbbbbbbbbabc

    其中为

    (?>(?:a|b|c)*)abc 将不匹配 AAAAA BBBBBBBBBBB ABC
    因为 (?:a|b|c)* 条款消耗了一切,没有留下任何空间
    发现 abc .

    一个好的经验法则是:

    如果量词是 外部的 对于原子组,它可以控制回溯
    外部。

    如果量词是 内部的 对于原子组,它可以控制回溯
    仅限内部。

    并且,当你量化一个原子群时,在每次传递时,流都会退出
    组,使 那个 合格的结果(作为一个整体)有资格被回溯。