正規表示式優化

2021-07-15 13:07:18 字數 1094 閱讀 4287

正規表示式的優化  在jeffrey e. f. friedl 的《精通正規表示式》中提到了幾種技巧。今天著重說一種比較實用的。

比較簡單的:

在類似 .* 或者 [\s\s]*中匹配的時候,量詞* 預設是貪婪的,啟用最大匹配模式, 會匹配到盡量多的字串,如果我們的需求是匹配text中的text,這樣就不適用了。具體來說,我們假設這個正規表示式是:.*但是如果目標字串很長textssssssssssss....(此處省略100000個s) 這樣就很悲催,.* 會匹配後面所有的字串,也就是 100000+ 的字串,然後乙個乙個回朔,回朔100000多次之後才正確匹配

很顯然這種量詞最大匹配的模式效率很差,當然字串小的話無所謂,可以用?號開啟最小匹配模式。優化後的表示式是.*?, 讓*號預設從小的開始,就是匹配乙個字元之後,將後面的跟進行對比。這樣4次比較就哦了。 

稍微複雜點的:

在書中,提煉出了一種匹配的通用模式

normal*(specail normal*) 咋一看不知道什麼意思,簡單的說 就是讓normail盡量多的匹配正常的文字,然後摘出需要特殊處理的字元,增加對非常規字元的處理。我們舉乙個例子來說明這種問題。

還是匹配text一般的,嚴格一點,我們使用(?!.)*來匹配只要中間不出現或者都認為結束了,但是這是乙個串匹配的過程,效率還不是最優的。

用通用模式來實現可以寫成:

#匹配開頭的

(?>[^<]*)            #匹配任意數量的normal 

(?>                 #固化分組

(?!)    #錨定不是需要標籤的字元

<                  #特殊字元

[^<]*              #匹配任意數量的normal

#匹配尾部的

這種模式的核心思想視永不回朔,永遠向前匹配,技巧性很強,你得先分析出什麼字元可以作為specail的,在本例中,使用了< 字元,應為的第乙個字元就是 < , 把中間的內容都跟《比, 中間內容可能含有諸如此類的內容, 要把跟區分開來,使用了錨定,相當於在有< 的時候做下判斷,是單字元比較,速度較快。

正規表示式優化

正規表示式的優化 在jeffrey e.f.friedl 的 精通正規表示式 中提到了幾種技巧。今天著重說一種比較實用的。比較簡單的 在類似 或者 s s 中匹配的時候,量詞 預設是貪婪的,啟用最大匹配模式,會匹配到盡量多的字串,如果我們的需求是匹配text中的text,這樣就不適用了。具體來說,我...

正規表示式 正規表示式 總結

非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...

正規表示式 表示式

網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...