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