通过添加+

问题描述:

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

+2

您可以发布一些需要优化的正则表达式吗?通过示例进行优化可以帮助您更好地理解应该在什么情况下使用某些优化。 – strager 2010-08-01 21:32:47

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

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

请注意,限制回溯通常不是“优化”,因为它会更改将会匹配和不匹配的内容。这个想法是,你用它来更好地描述你实际想要匹配的东西。从OP的回答中链接的文章中,像^(.*?,){11}P(第十二个逗号分隔的字段开始P)不仅效率低下,而且是不正确的,因为回溯将导致它实际上匹配,即使仅在第十二个字段开始于P之后的字段也是如此。通过将其更正为^(?>.*?,){11}P,您将限制其实际匹配正确数量的主要字段。 (在这个微不足道的情况下,^([^,]*,){11}P也可以完成这项工作,但是如果您在使用替换的字段中添加了对逃脱或引用逗号的支持,则(?>将成为更容易的选择。)

嗯...有一次我张贴的问题,在看“相关”列促使我这里面有一些非常好的想法.... http://www.regular-expressions.info/catastrophic.html