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

Mar*_*eck 5 regex optimization perl

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

/\s*$word_pattern\s*/
Run Code Online (Sandbox Code Playgroud)

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

/(?>\s*)$word_pattern\s*/
Run Code Online (Sandbox Code Playgroud)

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

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

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

然后

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

perl -ne 'print !/(?>a*)b/' < a.txt
Run Code Online (Sandbox Code Playgroud)

两者都占用了很多,但相同的时间(超过了读取文件本身所需的时间).

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

Cas*_*yte 1

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

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

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

您可以阅读此主题:http://www.perlmonks.org/? node_id=664545 关于该主题。