首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(?>EXPR|)和(?:EXPR)?+有什么区别吗?

(?>EXPR|)和(?:EXPR)?+有什么区别吗?
EN

Stack Overflow用户
提问于 2021-06-09 18:25:56
回答 1查看 38关注 0票数 1

在下面的文章中,我将考虑正则表达式(?>EXPR|)(?:EXPR)?+

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

  • 使用(?>A|AB|)C,它将首先尝试匹配A,然后失败(因为A字符后面没有C),并且它将尝试匹配AB而不可能回溯,因此它将再次失败(因为A字符已经被消耗),最后它将匹配空字符串,第三次失败。两个字符之后,它将找到子字符串C,这显然与模式匹配。
  • 使用(?:A|AB)?+C,它将首先尝试与A匹配,然后它将失败(因为A字符后面没有C),而且由于拥有量词+,它没有进一步发展的可能性。两个字符之后,它将找到子字符串C,这显然与模式匹配。

问题是:即使(?>EXPR|)(?:EXPR)?+以不同的方式工作,它们在语义上是否是等价的?

EN

回答 1

Stack Overflow用户

发布于 2021-06-09 20:09:14

原子群参考

原子组是一个组,当regex引擎退出时,它会自动丢弃组内任何令牌记住的所有回溯位置。原子群是非捕获的。语法是(?>group)环顾小组也是原子的。大多数现代正则表达式风格都支持原子分组,包括JGsoft风味、JavaPCRE.NETPerl助推红宝石。其中大多数还支持占有量词,这对于原子分组来说本质上是一种符号上的方便。

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

如果您用一个非捕获组包装一组模式,并为这个组设置一个拥有式量词,那么它就像一个原子组。

由于(?>A|AB)?是与AAB匹配的可选原子组(而且原子组不是捕获的),所以它与(?>A|AB|)匹配AAB或空字符串(因此,它在某种程度上也是可选的)。

代码语言:javascript
复制
(?>A|AB)?C = (?>A|AB|)C = (?:A|AB)?+C
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67909800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档