5

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

/\s*$word_pattern\s*/

但这在失败的情况下效率很低,不是吗?有效的代码不应该是:

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

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

另外:是的,我现在对其进行了基准测试,并且由于其中一位响应者可能在这里遇到了空格问题,因此我不想使用它。

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

接着

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

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

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

我完全不明白。有人能解释一下怎么可能吗?Perl 文档清楚地表明,在第一种情况下,将会进行回溯。

4

2 回答 2

1

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

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

  1. 模式中失败后禁止回溯,(但子模式可以在一个实体块中“回溯”)
  2. 正则表达式引擎不记录原子组内的回溯位置,那么正则表达式引擎将更快地工作。

你可以阅读这个主题:http ://www.perlmonks.org/?node_id=664545关于这个主题。

于 2013-10-24T22:02:14.113 回答
0

基本上,我发现,是的,第二种方式应该更快,但是因为第一种方式在这个简单的情况下进行了优化,所以它和第二种方式一样快。

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

谢谢大家。

于 2013-10-25T00:49:48.663 回答