作为一个常见的例子,假设我们想要匹配一些单词模式$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文档清楚地说,在第一种情况下,会有回溯。
答案 0 :(得分:0)
“低效”否,但在失败的情况下效率较低和以防成功。您可以看到一定数量的数据存在真正的差异。
(?>\s*)
或\s*+
有两个后果:
您可以阅读以下主题:http://www.perlmonks.org/?node_id=664545。
答案 1 :(得分:0)
基本上,我发现的是,是的,第二种方式应该更快,但因为第一种方法在这种简单的情况下得到优化,它与第二种方式一样快。
我应该阅读整本骆驼书(但谁曾经做过?)。因为,当我刚读取规范内容时,它意味着(?>...)
更快。而且可能是复杂的情况。但是在简单的情况下,有优化,Camel谈到这一点,它只是,我没有阅读它,因为它不需要学习语言。
谢谢大家。