Joe*_*Fan 1 regex perl performance
我在Perl脚本中有一些正确但速度慢的正则表达式.我正在考虑通过添加额外的+运算符(即*+而不是*和++而不是+)来尝试提高性能,以禁用回溯.我尝试更换所有这些并且正则表达式停止工作......这么简单的解决方案.我怎么知道在哪里可以添加它们不会破坏正则表达式?
如果正则表达式停止工作,您要么不使用支持它们的perl版本,要么实际上在这些情况下确实需要回溯.
确定不需要回溯的正则表达式的部分(即,如果要求在给定点开始匹配,则可能永远不会有多个长度,您可能希望它们匹配),并用它们包围它们(?> ).这与++/*+具有相同的效果,甚至在5.10之前也得到支持.
请注意,限制回溯通常不是"优化",因为它会更改将要匹配的内容.这个想法是你用它来更好地描述你真正想要匹配的东西.借用OP答案中链接的文章,类似^(.*?,){11}P(第十二个逗号分隔字段开始P)不仅效率低,而且不正确,因为即使只有第12个字段后面的字段以P开头,回溯也会使其实际匹配.纠正它^(?>.*?,){11}P是限制它实际匹配正确数量的前导字段.(在这个简单的情况下,^([^,]*,){11}P也可以完成这项工作,但是如果您使用交替添加对字段中的转义或引用逗号的支持,则(?>成为更容易的选择.)