粗淺地編寫正規表示式是造成效能瓶頸的主要原因,但還有很多可以改進正規表示式效率的地方。兩個正規表示式匹配相同的文字並不意味著他們具有同等的速度。
許多因素影響正規表示式的效率,首先,正規表示式適配的文字千差萬別,部分匹配時比完全不匹配所用的時間要長。每種瀏覽器的正規表示式引擎也有不同的內部優化。
為了有效地使用正規表示式,重要的是理解它們的工作原理。下面是乙個正規表示式處理的基本步驟:
第一步:編譯
當你建立了乙個正規表示式物件之後(使用乙個正規表示式直接量或者regexp構造器),瀏覽器檢查你的模板有沒有錯誤,然後將它轉換成乙個本機**例程,用於執行匹配工作。如果你將正規表示式賦給乙個變數,你可以避免重複執行此步驟。
第二步:設定起始位置
當乙個正規表示式投入使用時,首先要確定目標字串中開始搜尋的位置。它是字串的起始位置,或由正規表示式的lastindex屬性指定,但是當它從第四步返回到這裡的時候(因為嘗試匹配失敗),此位置將位於最後一次嘗試起始位置推後乙個字元的位置上。
瀏覽器優化正規表示式引擎的辦法是,在這一階段中通過早期**跳過一些不必要的工作。例如,如果乙個正規表示式以^開頭,ie 和chrome通常判斷在字串起始位置上是否能夠匹配,然後可避免愚蠢地搜尋後續位置。另乙個例子是匹配第三個字母是x的字串,乙個聰明的辦法是先找到x,然後再將起始位置回溯兩個字元。
第三步:匹配每個正規表示式的字元
正規表示式一旦找好起始位置,它將乙個乙個地掃瞄目標文字和正規表示式模板。當乙個特定字元匹配失敗時,正規表示式將試圖回溯到掃瞄之前的位置上,然後進入正規表示式其他可能的路徑上。
第四步:匹配成功或失敗
如果在字串的當前位置上發現乙個完全匹配,那麼正規表示式宣布成功。如果正規表示式的所有可能路徑都嘗試過了,但是沒有成功地匹配,那麼正規表示式引擎回到第二步,從字串的下乙個字元重新嘗試。只有字串中的每個字元(以及最後乙個字元後面的位置)都經歷了這樣的過程之後,還沒有成功匹配,那麼正規表示式就宣布徹底失敗。
牢記這一過程將有助於您明智地判別那些影響正規表示式效能問題的型別。
**:
正規表示式工作原理
粗淺地編寫正規表示式是造成效能瓶頸的主要原因,但還有很多可以改進正規表示式效率的地方。兩個正規表示式匹配相同的文字並不意味著他們具有同等的速度。許多因素影響正規表示式的效率,首先,正規表示式適配的文字千差萬別,部分匹配時比完全不匹配所用的時間要長。每種瀏覽器的正規表示式引擎也有不同的內部優化。為了有...
正規表示式匹配原理
正規表示式匹配原理 本章節將會簡單的介紹一下正規表示式匹配原理,這將有助於書寫更為有效率的正規表示式,而不僅僅能夠完成匹配任務。一.關於正規表示式引擎 正則引擎大體上可分為不同的兩類 dfa和nfa。1.dfa是deterministic finite automaton的縮寫,確定型有窮自動機。2...
正規表示式 正規表示式 總結
非負整數 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...