在下面的文章中,我将考虑正则表达式(?>EXPR|)和(?:EXPR)?+。
假设我们想要匹配字符串ABC。
(?>A|AB|)C,它将首先尝试匹配A,然后失败(因为A字符后面没有C),并且它将尝试匹配AB而不可能回溯,因此它将再次失败(因为A字符已经被消耗),最后它将匹配空字符串,第三次失败。两个字符之后,它将找到子字符串C,这显然与模式匹配。(?:A|AB)?+C,它将首先尝试与A匹配,然后它将失败(因为A字符后面没有C),而且由于拥有量词+,它没有进一步发展的可能性。两个字符之后,它将找到子字符串C,这显然与模式匹配。问题是:即使(?>EXPR|)和(?:EXPR)?+以不同的方式工作,它们在语义上是否是等价的?
发布于 2021-06-09 20:09:14
原子组是一个组,当regex引擎退出时,它会自动丢弃组内任何令牌记住的所有回溯位置。原子群是非捕获的。语法是
(?>group)。环顾小组也是原子的。大多数现代正则表达式风格都支持原子分组,包括JGsoft风味、Java、PCRE、.NET、Perl、助推和红宝石。其中大多数还支持占有量词,这对于原子分组来说本质上是一种符号上的方便。
请注意,拥有式量词对于原子分组来说是一种符号化的方便,它们的工作方式是相同的:它们使它们的模式匹配一次,而不允许对这些模式进行任何回溯。
如果您用一个非捕获组包装一组模式,并为这个组设置一个拥有式量词,那么它就像一个原子组。
由于(?>A|AB)?是与A或AB匹配的可选原子组(而且原子组不是捕获的),所以它与(?>A|AB|)匹配A、AB或空字符串(因此,它在某种程度上也是可选的)。
(?>A|AB)?C = (?>A|AB|)C = (?:A|AB)?+Chttps://stackoverflow.com/questions/67909800
复制相似问题