首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原子群是否总是在里面用交替?

原子群是否总是在里面用交替?
EN

Stack Overflow用户
提问于 2014-06-07 14:59:42
回答 1查看 151关注 0票数 2

原子群总是与交替的|一起使用吗?我的印象来自于“所有回溯位置,所有回溯位置都会被组内的任何标记记住”从…

原子组是一个组,当正则表达式引擎退出时,它会自动丢弃--组中的任何标记记住的所有回溯位置。原子群是非捕获的。语法是(?>group)。 一个例子将使原子群的行为变得清晰。正则表达式a(bc\b)c(捕获组)与abcc和abc匹配。正则表达式a(?>bc|b)c (原子组)匹配abcc,而不是abc。

你能给出一个例子吗?在这里,原子组被使用而不需要改变|?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2014-06-07 20:13:30

交替与原子组无关。原子群的目的是避免回溯。造成这种情况的主要原因有两个:

  1. 当正则表达式不匹配时,避免不必要的回溯。
  2. 避免回溯到表达式中不想找到匹配的部分

您要求提供一个没有变化的原子分组的示例。

让我们看看这两种用途。

A.避免对失败的进行回溯

例如,考虑这两个字符串:

代码语言:javascript
复制
name=Joe species=hamster food=carrot says:{I love carrots} 
name=Joe species=hamster food=carrot says:{I love peas}

假设我们希望找到一个格式良好的字符串(它有key=value标记),并且在令牌之后有carrots,也许在says部分中。尝试这样做的一种方法是:

非原子版

代码语言:javascript
复制
^(?:\w+=\w+\s+)*.*carrots

这将匹配第一个字符串,而不是第二个字符串。我们很开心。或者..。我们真的是吗?有两个不快乐的理由。我们将在B部分讨论第二个原因(原子群的第二个主要原因)。第一个原因是什么?

那么,当您在RegexBuddy中调试失败案例时,您会看到在引擎决定它不能匹配第二个字符串之前,它要执行引擎401步骤。这是很长的时间,因为在匹配令牌和在carrots中不匹配says:{I love peas}之后,引擎返回到(\w+=\w+\s+)*中,希望在那里找到carrots。现在让我们看一个原子版本。

原子版

代码语言:javascript
复制
^(?>(?:\w+=\w+\s+)*).*carrots

在这里,原子组阻止引擎回溯到(?:\w+=\w+\s+)*。结果是,在第二个字符串中,引擎在64步内失败。比401快得多!

B.避免对不需要匹配的部分字符串进行回溯,

保持相同的正则表达式,让我们稍微修改字符串:

代码语言:javascript
复制
name=Joe species=hamster food=carrots says:{I love carrots} 
name=Joe species=hamster food=carrots says:{I love peas}

我们的原子正则表达式仍然有效(它匹配第一个字符串,但不匹配第二个字符串)。

但是,非原子正则表达式现在匹配这两个字符串!这是因为在未能在carrots中找到says:{I love peas}之后,引擎返回到令牌中,并在food=carrots中找到carrots

因此,在这个实例中,原子组是一个方便的工具,可以跳过字符串中我们不想找到carrots的部分,同时确保它是格式良好的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24098513

复制
相关文章

相似问题

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