Regex (>;EXPR|)和(?:EXPR)&&x2B之间有什么区别吗; 下面我将考虑正则表达式(?> ExpR>)/代码>和(?:EXPR)+> < /P>

Regex (>;EXPR|)和(?:EXPR)&&x2B之间有什么区别吗; 下面我将考虑正则表达式(?> ExpR>)/代码>和(?:EXPR)+> < /P>,regex,Regex,假设我们想要匹配字符串ABC 使用(?>A | AB |)C它将首先尝试匹配A,然后它将失败(因为A字符后面没有C),它将尝试匹配AB,而不可能回溯,因此它将再次失败(因为A字符已被使用)最后它将匹配空字符串,第三次失败。两个字符后,它将找到子字符串C,该子字符串显然与模式匹配 使用(?:A | AB)+C它将首先尝试匹配A,然后它将失败(因为A字符后面没有C),并且由于所有格量词+,它没有进一步的可能性。两个字符后,它将找到子字符串C,该子字符串显然与模式匹配 问题是:即使(?>EXPR

假设我们想要匹配字符串
ABC

  • 使用
    (?>A | AB |)C
    它将首先尝试匹配
    A
    ,然后它将失败(因为
    A
    字符后面没有
    C
    ),它将尝试匹配
    AB
    ,而不可能回溯,因此它将再次失败(因为
    A
    字符已被使用)最后它将匹配空字符串,第三次失败。两个字符后,它将找到子字符串
    C
    ,该子字符串显然与模式匹配
  • 使用
    (?:A | AB)+C
    它将首先尝试匹配
    A
    ,然后它将失败(因为
    A
    字符后面没有
    C
    ),并且由于所有格量词
    +
    ,它没有进一步的可能性。两个字符后,它将找到子字符串
    C
    ,该子字符串显然与模式匹配
问题是:即使
(?>EXPR |)
(?:EXPR)+
以不同的方式工作,它们在语义上是否等效?

请参见:

原子组是一个组,当正则表达式引擎退出时,它会自动丢弃组内任何令牌所记住的所有回溯位置。原子群是不可捕获的。语法是
(?>组)
。它们也是原子的。大多数现代正则表达式风格都支持原子分组,包括风格、、和。其中大多数还支持,这本质上是原子分组的一种符号方便

请注意,所有格量词是原子分组的一种符号便利,它们的作用方式是相同的:它们使模式匹配一次,而不允许对这些模式进行任何回溯

如果将一组模式包装为非捕获组,并将所有格量词设置为该组,则其行为类似于原子组

由于
(?>A | AB)
是一个可选的原子组,它匹配
A
AB
(并且原子组是非捕获的),因此它与
(?>A | AB |)
匹配
A
AB
或空字符串(因此,它在某种程度上也是可选的)


所有格量词在功能上等同于原子群,两者都是为了防止回到量化模式。如果将一组模式包装为非捕获组,并将所有格量词设置为该组,则其行为类似于原子组<代码>(?>A|AB)?C=
(?>A|AB|)C
=
(?:A|AB)?+C
(?>A|AB)?C = (?>A|AB|)C = (?:A|AB)?+C