來改善Perl正則表達式我在Perl腳本中有一些正確但緩慢的正則表達式。我正在考慮通過添加額外的+運算符(即* +而不是*和++而不是+)來禁用回溯來嘗試提高性能。我試圖替換所有這些,並且正則表達式停止工作......對於簡單的解決方案非常重要。我怎麼知道我可以將它們添加到哪裏不會破壞正則表達式?通過添加+
Q
通過添加+
1
A
回答
6
如果正則表達式停止工作,你要麼不是活得t使用支持它們的perl版本,或者實際上在這些情況下確實需要回溯。
確定不需要回溯的正則表達式部分(也就是說,如果要求匹配從給定點開始,永遠不會有超過一個長度,您可能希望它們匹配),並圍繞它們與(?> )
。這與++/* +具有相同的效果,並且甚至在5.10之前也支持。
請注意,限制回溯通常不是「優化」,因爲它會更改將會匹配和不匹配的內容。這個想法是,你用它來更好地描述你實際想要匹配的東西。從OP的回答中鏈接的文章中,像^(.*?,){11}P
(第十二個逗號分隔的字段開始P)不僅效率低下,而且是不正確的,因爲回溯將導致它實際上匹配,即使僅在第十二個字段開始於P之後的字段也是如此。通過將其更正爲^(?>.*?,){11}P
,您將限制其實際匹配正確數量的主要字段。 (在這個微不足道的情況下,^([^,]*,){11}P
也可以完成這項工作,但是如果您在使用替換的字段中添加了對逃脫或引用逗號的支持,則(?>
將成爲更容易的選擇。)
0
嗯...有一次我張貼的問題,在看「相關」列促使我這裏面有一些非常好的想法.... http://www.regular-expressions.info/catastrophic.html
相關問題
- 1. 添加通過addContentView
- 2. 通過添加類
- 3. 添加通過PHP
- 4. 通過添加1
- 5. 通過添加timedelta
- 6. 添加通過PerformanceCounterCategory
- 7. C#ArrayList.Add通過Ref添加?
- 8. 通過TypeBuilder添加DisplayAttribute
- 9. 通過jQuery添加課程
- 10. 如何添加將通過
- 11. 通過post.jar添加文檔
- 12. 添加通過結合
- 13. 通過Ajax添加腳本
- 14. 通過jquery添加課程
- 15. #_ = _通過Facebook添加到URL
- 16. 集團通過或添加
- 17. 通過DataExtension添加Tab Silverstripe3
- 18. 通過UITabBarController添加UIPickerView
- 19. 添加通過轉/ LDAP
- 20. 通過UI添加對象
- 21. 通過Angular Script添加URL
- 22. 通過添加元素
- 23. 添加項目通過AJAX
- 24. 通過REST API添加Notificatoin
- 25. 動態添加通過DOM
- 26. 通過矢量添加
- 27. 通過MainActivity添加webview
- 28. 即使通過添加SetBarEnabled
- 29. 通過Fluid添加magnificPopup
- 30. 通過PHPMailer添加附件
您可以發佈一些需要優化的正則表達式嗎?通過示例進行優化可以幫助您更好地理解應該在什麼情況下使用某些優化。 – strager 2010-08-01 21:32:47