原子群总是与交替的|一起使用吗?我的印象来自于“所有回溯位置,所有回溯位置都会被组内的任何标记记住”从…
原子组是一个组,当正则表达式引擎退出时,它会自动丢弃--组中的任何标记记住的所有回溯位置。原子群是非捕获的。语法是(?>group)。 一个例子将使原子群的行为变得清晰。正则表达式a(bc\b)c(捕获组)与abcc和abc匹配。正则表达式a(?>bc|b)c (原子组)匹配abcc,而不是abc。
你能给出一个例子吗?在这里,原子组被使用而不需要改变|?谢谢。
发布于 2014-06-07 20:13:30
交替与原子组无关。原子群的目的是避免回溯。造成这种情况的主要原因有两个:
您要求提供一个没有变化的原子分组的示例。
让我们看看这两种用途。
A.避免对失败的进行回溯
例如,考虑这两个字符串:
name=Joe species=hamster food=carrot says:{I love carrots}
name=Joe species=hamster food=carrot says:{I love peas}假设我们希望找到一个格式良好的字符串(它有key=value标记),并且在令牌之后有carrots,也许在says部分中。尝试这样做的一种方法是:
非原子版
^(?:\w+=\w+\s+)*.*carrots这将匹配第一个字符串,而不是第二个字符串。我们很开心。或者..。我们真的是吗?有两个不快乐的理由。我们将在B部分讨论第二个原因(原子群的第二个主要原因)。第一个原因是什么?
那么,当您在RegexBuddy中调试失败案例时,您会看到在引擎决定它不能匹配第二个字符串之前,它要执行引擎401步骤。这是很长的时间,因为在匹配令牌和在carrots中不匹配says:{I love peas}之后,引擎返回到(\w+=\w+\s+)*中,希望在那里找到carrots。现在让我们看一个原子版本。
原子版
^(?>(?:\w+=\w+\s+)*).*carrots在这里,原子组阻止引擎回溯到(?:\w+=\w+\s+)*。结果是,在第二个字符串中,引擎在64步内失败。比401快得多!
B.避免对不需要匹配的部分字符串进行回溯,
保持相同的正则表达式,让我们稍微修改字符串:
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的部分,同时确保它是格式良好的。
https://stackoverflow.com/questions/24098513
复制相似问题