代码之家  ›  专栏  ›  技术社区  ›  JoelFan

通过添加+

  •  1
  • JoelFan  · 技术社区  · 14 年前

    我在Perl脚本中有一些正则表达式,它们是正确的,但是速度很慢。我正在考虑通过添加额外的+运算符(即*+而不是*和++而不是+)来禁用回溯来提高性能。我试着把它们全部替换掉,正则表达式就停止工作了。。。简单的解决方案到此为止。我怎么知道我可以在哪里添加它们,在那里它不会破坏正则表达式?

    2 回复  |  直到 14 年前
        1
  •  6
  •   ysth    14 年前

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

    请注意,限制回溯通常不是“优化”,因为它会改变将要匹配和将不匹配的内容。这个想法是你用它来更好地描述你真正想要的。借用OP答案中的链接文章 ^(.*?,){11}P (第十二个逗号分隔的字段从P开始)不仅效率低下,而且是不正确的,因为回溯将导致它实际匹配,即使第十二个之后只有一个字段以P开始。把它改成 ^(?>.*?,){11}P ^([^,]*,){11}P 也可以这样做,但是如果您在使用alternation的字段中添加对转义或引号逗号的支持, (?> 成为更容易的选择。)

        2
  •  0
  •   JoelFan    14 年前

    六羟甲基三聚氰胺六甲醚。。。一旦我发布了这个问题,看看“相关”专栏,我就想到了这个,它有一些非常好的想法。。。。 http://www.regular-expressions.info/catastrophic.html