正則表達式優化

這裏說的正則表達式優化,主要是針對目前經常使用的NFA模式正則表達式,javascript

 

詳細能夠參考:正則表達式匹配解析過程探討分析(正則表達式匹配原理)html

 

從上面例子,咱們能夠推斷出,影響NFA類正則表達式java

(常見語言:GNU Emacs,Java,ergp,less,more,.NET語言, 
PCRE library,Perl,PHP,Python,Ruby,sed,vi )正則表達式

 

其實主要是它的「回溯」,減小「回溯」次數(減小循環查找同一個字符次數),是提升性能的主要方法。 咱們來看個例子:性能優化

 

源字符串:<script type="text/javascript">adsfadfsdasfsdafdsfsadfsa</script>less

匹配要求,匹配<script….>….</script>標籤裏面全部內容,包括改標籤工具

 

常見寫法(1),由於<script後面可能出現字符、空白、特殊符號等,還有標籤裏面也可能出現各類js代碼。性能

咱們簡單方法是:測試

正則表達式:<script.*?> .*? </script> 優化

(測試工具使用了:regexBuddy)

 

正則表達式性能優化 
總共花費115步,回溯了:48次。 由於咱們使用」.」字符,匹配默認狀況下除了\n以外全部字符。

 

方法(2),咱們分析特色發現,<script…>後面,應該是除了」>」以外均可以字符,而後一對<script>標籤裏面js內容。

能夠定義爲除了」<」以外。(這裏面我只是舉例說明優化方法,實際網頁中script標籤裏面,常見都會出現有」<」字符了

正則表達式:<script[^?>]+> [^<]+  </script>

正則表達式性能優化 
19步,0次回溯! ,步驟只有原先的15%左右,性能幾倍的提高了!

 

從上面咱們看到,不一樣正則表達式,對通用字符配平,性能相差會很大。

減小「回溯」是最好的方法,減小回溯其中最主要的方法是:」用最小範圍的元字符,儘可能避免用過大的元字符!」。

 

通常規律以下:

一、使用正確的邊界匹配器(^、$、\b、\B等),限定搜索字符串位置

二、使用具體的元字符、字符類(\d、\w、\s等) ,少用」.」字符

三、使用正確的量詞(+、*、?、{n,m}),若是可以限定長度,匹配最佳

四、使用非捕獲組、原子組,減小沒有必要的字匹配捕獲用(?:)

 

如:我想匹配一些英文字母,它後面接的是數字。

如:abc1234,我能夠寫 「\w+\d+」,也能夠寫」[a-zA-Z]+\d+」 ,

其中第一個\w+會先匹配全部abc1234,而後回溯,匹配知足\d+格式

 

一共4步,然後面這個只須要2步,步驟減小一半了!好了,今天就先到這裏,歡迎你們討論、交流!

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息