正则表达式原子团是分配的吗?

eya*_*ler 11 regex

正则表达式原子团是分配的吗?

(?>A?B?)总是相当于(?>A?)(?>B?)

如果没有,请提供一个反例.

age*_*t-j 2

一般原子团

  1. 原子组(?>regex1|regex2|regex3)仅采用其中的第一个成功匹配。换句话说,它不允许回溯。

  2. 正则表达式是从左到右计算的,因此您可以表达您想要匹配的顺序。引擎从第一个位置启动,尝试进行成功的匹配,必要时回溯。如果表达式中的任何路径都会导致成功匹配,那么它将在该位置匹配。

  3. 原子团不具有分配性。考虑对以下模式进行评估ABC:( (?>(AB?))(?>(BC))不匹配)和(?>(AB?)(BC))(匹配ABC)。

具有所有可选组件的原子团

但是,两个部分都是可选的情况可能会有所不同。

考虑一个具有 2 个贪婪可选部分 A 和 B ((A)?(B)?) 的原子组。在任何位置,如果A匹配,它可以继续评估可选的B。否则,如果A不匹配,也没关系,因为它是可选的。因此,(A)?可以在任何位置进行匹配。同样的逻辑适用于可选的B. 剩下的问题是回溯是否会有任何差异。

在所有可选部分 ( ) 的情况下(?>A?B?),由于每个部分始终匹配,因此没有理由在原子组内回溯,因此它将始终匹配。那么,由于它在原子组中,所以禁止回溯。

在单独原子组 ( ) 的情况下(?>A?)(?>B?),每个部分始终匹配,并且在任何一种情况下都禁止引擎回溯。这意味着结果将是相同的。

重申一下,引擎只能使用 中的第一个可能的匹配(?>A?)(?>B?),它始终与 中的第一个可能的匹配相同(?>A?B?)。因此,如果我的推理是正确的,对于这种特殊情况,多个可选原子组的匹配将与具有两个可选组件的单个原子组相同。