在java中對正則表達式優化閱讀一個不錯的article後,我想知道什麼是用於創建快速,高效的正則表達式的其他好的建議嗎?正則表達式的性能優化技巧和竅門
回答
使用任何(點)操作謹慎,如果你能做到這一點任何其他方式,這樣做,圓點總是會咬你......
我不知道是否PCRE是NFA,我只熟悉PCRE,但默認情況下+和*通常是貪婪的,他們會盡可能地匹配使用+。和*?儘可能少的匹配,在寫你的正則表達式的時候記住這兩個條款。
知道什麼時候不是使用正則表達式 - 有時一個手工編碼的解決方案更有效,更容易理解。
例如:假設你想匹配一個可以被3整除的整數。設計一個有限狀態機來完成這個操作是微不足道的,因此相應的正則表達式必須存在,但是寫出它並不是那麼簡單 - 而且我肯定討厭必須調試它!
是的......但在一些數字系統中它是微不足道的。 :-P – 2013-08-31 12:18:59
您的意思是:((((0 | 3 | 6 | 9)|((1 | 4 | 7)(0 | 3 | 6 | 9)*(2 | 5 | 8)))|( ((2 | 5 | 8)|((1 | 4 | 7)(0 | 3 | 6 | 9)*(1 | 4 | 7)))((0 | 3 | 6 | 9)|((2- | 5 | 8)(0 | 3 | 6 | 9)*(1 | 4 | 7)))*((1 | 4 | 7)|((2 | 5 | 8)(0 | 3 | 6 | 9 )*(2 | 5 | 8)))))*'? (是的,我做了一個DFA,然後是GNFA,然後是正則表達式:p) – 2015-02-17 18:08:38
如果沒有反向引用,請使用快速實現。 https://swtch.com/~rsc/regexp/regexp1.html – clemens 2015-06-05 07:09:00
- 使用非捕獲組
(?:pattern)
當你需要重複一組,但並不需要使用來自一個傳統(capturing)
組捕捉值。 - 適用時使用atomic group(或非回溯子表達式)
(?>pattern)
。 - 避免catastrophic backtracking像瘟疫一樣,通過設計正則表達式來儘早終止非匹配。
我創建了一個視頻展示了這些技術。我從非常 文章(x+x+)+y
寫得很差的正則表達式開始。然後在一系列優化之後,我做了300萬次,每次更改後都進行基準測試。視頻是特定於.NET,但它們中的很多適用於大多數其他正則表達式的口味,以及:
- 1. vs2010可擴展性技巧和竅門
- 2. IntelliJ git集成技巧和竅門
- 3. html quickform使用技巧和竅門
- 4. 瓦拉:陷阱,技巧和竅門
- 5. 優化-webkit轉換性能的技巧?
- 6. 在Rails(2.x或3.x)中優化視圖性能的技巧/訣竅?
- 7. Django性能調優技巧?
- 8. 正則表達式優化
- 9. 優化正則表達式
- 10. 正則表達式優化
- 11. 優化正則表達式
- 12. 什麼是你最喜歡的顛覆技巧和竅門
- 13. 關於VHDL編碼技巧和竅門的問題
- 14. 如何優化正則表達式的性能?
- 15. 使用Java字符串時的技巧和竅門,以提高性能和安全性
- 16. C#中的優化技巧
- 17. \ K在AWK中正則表達式的技巧
- 18. java的正則表達式需要一些技巧
- 19. 在PL/SQL中隱藏/抽象SQL的技巧/竅門
- 20. 正則表達式的優化
- 21. 優化「標記」的正則表達式
- 22. 正則表達式:性能
- 23. php preg_split與正則表達式,需要一個技巧?
- 24. 2d圖形優化技巧
- 25. 基於「優化技巧」
- 26. Android代碼優化技巧
- 27. 代碼優化技巧:
- 28. MySQL查詢優化技巧
- 29. 查詢優化技巧
- 30. Php和正則表達式性能
我想提一下[布爾序列(https://github.com/NaturalIntelligence/BooleanSequence ),它目前支持較少的RE符號,但它們快速靈活,並且具有許多有用的功能。您可以編寫自己的匹配器來添加更多功能或使其更快。他們也做自動優化,你可以看到他們如何使用基於json或json的圖表進行評估。 – 2016-05-20 20:47:29