【发布时间】:2015-08-20 07:41:59
【问题描述】:
根据perlre,以下代码需要几秒钟才能执行:
$ time perl -E '$_="((()" . ("a") x 18; say "ok" if m{ \(([^()]+|\( [^()]* \))+\)}x;'
real 0m0.006s
user 0m0.000s
sys 0m0.005s
文档说:
考虑上面的模式如何检测到不匹配
((()aaaaaaaaaaaaaaaaaa在几秒钟内,但每个额外的 这次字母加倍。
正如所见,在我的笔记本电脑上只需要几分之一秒..
即使运行一百万个a 也可以在半秒内完成:
$ time perl -E '$_="((()" . ("a") x 1000000; say "ok" if m{ \(([^()]+|\( [^()]* \))+\)}x;'
real 0m0.454s
user 0m0.446s
sys 0m0.008s
我在这里错过了什么?
【问题讨论】:
-
perl 编译器可能会为您解决这个问题。尝试将 ((()aaaaaa 改为标准输入。
-
@ZanLynx 你是说
echo "((()aaaaaaaaaaaaaaaaaa" | perl -nE 'say "ok" if m{ \(([^()]+|\( [^()]* \))+\)}x;'吗? -
是的。或者从另一个 perl 脚本输出它,这样你就可以使用
x 10000 -
@ZanLynx
perl -E 'say "((()" . ("a") x 1000000;' | perl -nE 'say "ok" if m{ \(([^()]+|\( [^()]* \))+\)}x;'也在半秒内运行 -
试试
use re 'debug',它会告诉你处理re的步骤。
标签: regex perl backtracking