正則表達的應用及優化

2021-07-15 04:38:15 字數 884 閱讀 5419

正規表示式也講究效率的,因為不同的表示式引擎執行的演算法就不同。perl用的引擎是傳統nfa引擎。

正規表示式使用要注意第一點:

(1)使用字元組代替分支條件。

比如,使用[a-d]或[abcd]表示a-d之間的字母,而不要使用(a|b|c|d)。因為在匹配單個字元的時候,引擎會把[abcd]這樣的字元組視為乙個元素,而不是4個元素。整個元素作為匹配迭代的乙個單元,不像(a|b|c|d)要進行迭代4次。

(2)貪婪匹配、非貪婪匹配使用要注意

貪婪匹配可能會回溯多次,然後非貪婪也有可能回溯多次。所以要設計好,當然也可以用固化分組解決這個問題。詳情請看

貪婪與非貪婪原理分析

固化分組使用的好處

(3)只要能確定哪些字元範圍,就不用點號;只要能夠匹配重複次數,就不要用任意量詞。能使用懶惰匹配就堅決不用貪婪匹配

php的pcre擴充套件中提供了兩個設定項

pack.backtrack_limit最大回溯數

pcre.recursion_limit 最大巢狀層數

在正規表示式的使用中,應盡量避免回溯次數過多的情況。但有時候如果正規表示式的回溯真的多得沒法優化了。你又想提高網頁響應速度。就是把上面那個最大回溯數變大一點。

(4)盡量使用字串函式處理代替

因為字串函式處理的效率更高

(5)合理使用括號

每使用乙個普通括號,而不是非捕獲型括號(?:……)。就會保留一部分記憶體等著再次訪問。這樣的正規表示式、無限次的執行次數、無異於一根根稻草的堆加。

(6)盡量多的用^$這種起頭結尾標記,能更準確

(7)\d\d\d 和\d。====和={4}。在php中這兩種效率都等價。

(8)對大而全的表示式進行拆分

(9)使用正規表示式以外的解決辦法

正規表示式及在python中的應用

捕獲分詞 pyhton中的說明 符號說明 預設匹配 n之外的任意字元 匹配字元起始位置 匹配字元結尾 a只從字串開始匹配,類似 z匹配字串結尾,類似 d匹配數字0 9 d匹配非數字 w匹配數字字母 w匹配非數字字母 s匹配空格 s匹配空字元 t n r b匹配字串邊界,但不會消耗任何字元,只匹配乙個...

正規表示式的表示及基本應用

1.abc a b c中任意的乙個字元 2.abc 除了a b c的任意字元 3.a z a b c z中的任意乙個字元 4.a za z0 9 a z a z 0 9中任意乙個字元 5.a z bc a z中除了b和c以外的任意乙個字元,其中 表示 與 的關係 6.任意乙個字元 7.d 任意乙個數...

scanf與正規表示式的搭配及應用

正則其實我也學的不咋地,只會一點皮毛,正則最大的作用就是當輸入流是乙個字串,我們能在輸入的時候就濾掉無用資訊,省去後期提取數值的步驟。正則的語法我怕誤人子弟,嘿嘿,等我徹底理解之後再寫 使用方法 表示讀取長度為n的字串 輸入 123456 輸出str 123 以scanf 3s str 為例 表示讀...