是否应该一直使用原子组来加速失败?

时间:2013-10-24 21:43:06

标签: regex perl optimization

作为一个常见的例子,假设我们想要匹配一些单词模式$word_pattern,但它周围可能有空格。这是正则表达式的常见用法。通常人们会写

/\s*$word_pattern\s*/

但是如果失败则效率低下不是吗?效率代码不应该是:

/(?>\s*)$word_pattern\s*/

但我从来没有看到实际写的......

补充:是的我现在做了基准测试,并且由于其中一个响应者可能在这里有空白问题,我不想使用它。

所以现在我有一个非常长的文件a.txt(1GB),完全填充了字符a

然后

perl -ne 'print !/a*b/' < a.txt

perl -ne 'print !/(?>a*)b/' < a.txt

两者都需要很长的时间,但相同的时间(超过读取文件本身所需的时间)。

我根本不明白。谁能解释一下怎么会这样? Perl文档清楚地说,在第一种情况下,会有回溯。

2 个答案:

答案 0 :(得分:0)

“低效”否,但在失败的情况下效率较低以防成功。您可以看到一定数量的数据存在真正的差异。

(?>\s*)\s*+有两个后果:

  1. 在模式中出现故障后禁止回溯(但子模式可以在一个实体块中“回溯”)
  2. 原子组中的回溯位置不会被正则表达式引擎记录,然后正则表达式引擎将更快地运行。
  3. 您可以阅读以下主题:http://www.perlmonks.org/?node_id=664545

答案 1 :(得分:0)

基本上,我发现的是,是的,第二种方式应该更快,但因为第一种方法在这种简单的情况下得到优化,它与第二种方式一样快。

我应该阅读整本骆驼书(但谁曾经做过?)。因为,当我刚读取规范内容时,它意味着(?>...)更快。而且可能是复杂的情况。但是在简单的情况下,有优化,Camel谈到这一点,它只是,我没有阅读它,因为它不需要学习语言。

谢谢大家。