通过添加+来提高Perl正则表达式的性能

时间:2010-08-01 21:30:30

标签: regex performance perl

我在Perl脚本中有一些正确但很慢的正则表达式。我正在考虑通过添加额外的+运算符(即* +而不是*和++而不是+)来尝试提高性能,以禁用回溯。我尝试更换所有这些并且正则表达式停止工作......这么简单的解决方案。我怎么知道在哪里可以添加它们不会破坏正则表达式?

2 个答案:

答案 0 :(得分:6)

如果正则表达式停止工作,您要么不使用支持它们的perl版本,要么实际上在这些情况下确实需要回溯。

识别不需要回溯的正则表达式的部分(也就是说,如果要求在给定点开始匹配,那么你可能希望它们匹配的长度永远不会超过一个),并用它们包围它们(?> )。这与++ / * +具有相同的效果,甚至在5.10之前也支持。

请注意,限制回溯通常不是“优化”,因为它会更改将要匹配的内容。这个想法是你用它来更好地描述你真正想要匹配的东西。借用OP答案中链接的文章,类似^(.*?,){11}P(第12个逗号分隔字段开始P)不仅效率低,而且不正确,因为即使只有第12个字段后的字段,回溯也会导致它实际匹配以P开头。通过将其更正为^(?>.*?,){11}P,您将其限制为实际匹配正确数量的前导字段。 (在这个简单的情况下,^([^,]*,){11}P也可以完成这项工作,但如果您使用轮换添加对字段中的转义或引用逗号的支持,(?>将成为更容易的选择。)

答案 1 :(得分:0)

嗯...一旦我发布了这个问题,看看“相关”专栏就把我带到了这个有一些不错的想法...... http://www.regular-expressions.info/catastrophic.html