這裏說的正則表達式優化,主要是針對目前經常使用的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步,步驟減小一半了!好了,今天就先到這裏,歡迎你們討論、交流!