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文档清楚地说,在第一种情况下,会有回溯.
“低效”不是,而是在失败和成功的情况下效率较低。您可以看到一定数量的数据的真正差异。
(?>\s*)或者\s*+有两个后果:
您可以阅读此主题:http://www.perlmonks.org/? node_id=664545 关于该主题。