2009-08-09 78 views
15

在java中對正則表達式優化閱讀一個不錯的article後,我想知道什麼是用於創建快速,高效的正則表達式的其他好的建議嗎?正則表達式的性能優化技巧和竅門

+0

我想提一下[布爾序列(https://github.com/NaturalIntelligence/BooleanSequence ),它目前支持較少的RE符號,但它們快速靈活,並且具有許多有用的功能。您可以編寫自己的匹配器來添加更多功能或使其更快。他們也做自動優化,你可以看到他們如何使用基於json或json的圖表進行評估。 – 2016-05-20 20:47:29

回答

7

使用任何(點)操作謹慎,如果你能做到這一點任何其他方式,這樣做,圓點總是會咬你......

我不知道是否PCRE是NFA,我只熟悉PCRE,但默認情況下+和*通常是貪婪的,他們會盡可能地匹配使用+。和*?儘可能少的匹配,在寫你的正則表達式的時候記住這兩個條款。

3

知道什麼時候不是使用正則表達式 - 有時一個手工編碼的解決方案更有效,更容易理解。

例如:假設你想匹配一個可以被3整除的整數。設計一個有限狀態機來完成這個操作是微不足道的,因此相應的正則表達式必須存在,但是寫出它並不是那麼簡單 - 而且我肯定討厭必須調試它!

+1

是的......但在一些數字系統中它是微不足道的。 :-P – 2013-08-31 12:18:59

+9

您的意思是:((((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

+1

如果沒有反向引用,請使用快速實現。 https://swtch.com/~rsc/regexp/regexp1.html – clemens 2015-06-05 07:09:00

27
  1. 使用非捕獲組(?:pattern)當你需要重複一組,但並不需要使用來自一個傳統(capturing)組捕捉值。
  2. 適用時使用atomic group(或非回溯子表達式)(?>pattern)
  3. 避免catastrophic backtracking像瘟疫一樣,通過設計正則表達式來儘早終止非匹配。

我創建了一個視頻展示了這些技術。我從非常 文章(x+x+)+y寫得很差的正則表達式開始。然後在一系列優化之後,我做了300萬次,每次更改後都進行基準測試。視頻是特定於.NET,但它們中的很多適用於大多數其他正則表達式的口味,以及:

.NET Regex Lesson: #5: Optimization