2010-08-01 107 views
1

來改善Perl正則表達式我在Perl腳本中有一些正確但緩慢的正則表達式。我正在考慮通過添加額外的+運算符(即* +而不是*和++而不是+)來禁用回溯來嘗試提高性能。我試圖替換所有這些,並且正則表達式停止工作......對於簡單的解決方案非常重要。我怎麼知道我可以將它們添加到哪裏不會破壞正則表達式?通過添加+

+2

您可以發佈一些需要優化的正則表達式嗎?通過示例進行優化可以幫助您更好地理解應該在什麼情況下使用某些優化。 – strager 2010-08-01 21:32:47

回答

6

如果正則表達式停止工作,你要麼不是活得t使用支持它們的perl版本,或者實際上在這些情況下確實需要回溯。

確定不需要回溯的正則表達式部分(也就是說,如果要求匹配從給定點開始,永遠不會有超過一個長度,您可能希望它們匹配),並圍繞它們與(?> )。這與++/* +具有相同的效果,並且甚至在5.10之前也支持。

請注意,限制回溯通常不是「優化」,因爲它會更改將會匹配和不匹配的內容。這個想法是,你用它來更好地描述你實際想要匹配的東西。從OP的回答中鏈接的文章中,像^(.*?,){11}P(第十二個逗號分隔的字段開始P)不僅效率低下,而且是不正確的,因爲回溯將導致它實際上匹配,即使僅在第十二個字段開始於P之後的字段也是如此。通過將其更正爲^(?>.*?,){11}P,您將限制其實際匹配正確數量的主要字段。 (在這個微不足道的情況下,^([^,]*,){11}P也可以完成這項工作,但是如果您在使用替換的字段中添加了對逃脫或引用逗號的支持,則(?>將成爲更容易的選擇。)