如何分析 Perl 正则表达式?

Posted

技术标签:

【中文标题】如何分析 Perl 正则表达式?【英文标题】:How can I profile Perl regexes? 【发布时间】:2009-01-06 04:33:14 【问题描述】:

分析 Perl 正则表达式以确定它们的成本的最佳方法是什么?

【问题讨论】:

【参考方案1】:

Perl 带有Benchmark 模块,它可以获取大量代码样本,并回答“哪个更快?”的问题。我在Benchmarking Basics 上有一个Perl Tip,虽然它本身不使用正则表达式,但它确实提供了对该主题的快速而有用的介绍,以及进一步的参考。

brian d foy 在他的 Mastering Perl 书中也有一个关于基准测试的优秀章节。他很友善地提供了chapter on-line as a draft,非常值得一读。我真的不能推荐它。

保罗

【讨论】:

除了 Benchmarking 和 Profiling 章节,查看 regex 章节了解一些工具。 perl -Mre=debug / 使用 re 'debug';【参考方案2】:

不过,仅仅说“使用 Benchmark”模块并不能真正回答问题。对正则表达式进行基准测试不同于对计算进行基准测试;你需要大量的真实数据,这样你就可以像真实数据一样强调正则表达式。如果您的大部分数据都匹配,您需要一个快速匹配的正则表达式;如果大多数都会失败,那么您需要一个快速失败的正则表达式。他们最终可能是同一个正则表达式,但也许不是。

【讨论】:

【参考方案3】:

我的首选方法是向 RE 提供大量输入数据,然后处理该数据 N 次(例如,100,000)以查看需要多长时间。

然后调整 RE 并重试(将所有旧的 RE 保留为 cmets,以防将来需要再次对它们进行基准测试,谁知道 Perl 7 中可能会出现哪些奇妙的优化?)。

可能有一些工具可以分析 RE 为您提供特定输入的执行路径(例如 DBMS 中的分析工具),但是,由于 Perl 是懒惰的语言(Larry 自己传下来的一条诫命),我懒得去找它:-)。

【讨论】:

以上是关于如何分析 Perl 正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章

你如何评论 Perl 正则表达式?

Perl 正则表达式 |如何从文件中排除单词

如何 grep/perl/awk 重叠正则表达式

Perl高级应用教程

Perl 中的正则表达式组:如何从正则表达式组中捕获与字符串中出现的未知数量/多个/变量匹配的元素到数组中?

perl 和 java 正则表达式功能有啥区别?