讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議38:正確認識正則表達式工作機制 >

建議38:正確認識正則表達式工作機制

有很多因素影響正則表達式的效率。首先,正則表達式適配的文本千差萬別,部分匹配時比完全不匹配所用的時間要長。其次,每種瀏覽器的正則表達式引擎也有不同的內部優化。要有效使用正則表達式,重要的是理解它們的工作機制。一個正則表達式處理的基本步驟如下:

第1步,編譯。在創建了一個正則表達式對像後,瀏覽器先要檢查模板有沒有錯誤,然後將它轉換成一個本機代碼例程,用於執行匹配工作。如果將正則表達式賦給一個變量,就可以避免重複執行此步驟。

第2步,設置起始位置。當一個正則表達式投入使用時,要先確定目標字符串中開始搜索的位置。它是字符串的起始位置,或者由正則表達式的lastIndex屬性指定,但當它從第4步返回到這裡的時候,此位置將位於最後一次嘗試起始位置推後一個字符的位置上。

瀏覽器廠商優化正則表達式引擎的方法:在這一階段中通過早期預測跳過一些不必要的工作。例如,如果一個正則表達式以^開頭,IE和Chrome瀏覽器通常判斷在字符串起始位置上是否能夠匹配,進而避免不明智地搜索後續位置。另一個例子是匹配第三個字母是x的字符串,聰明的方法是先找到x,然後再將起始位置回溯兩個字符。

第3步,匹配每個正則表達式的字元。正則表達式一旦找好起始位置,將會一個個地掃瞄目標文本和正則表達式模板。當一個特定字元匹配失敗時,正則表達式將試圖回溯到掃瞄之前的位置上,然後進入正則表達式其他可能的路徑。

第4步,匹配成功或失敗。如果在字符串的當前位置上發現一個完全匹配的字符,那麼正則表達式宣佈成功。如果正則表達式的所有可能路徑都嘗試過了,但沒有成功匹配,那麼正則表達式引擎回到第2步,從字符串的下一個字符重新嘗試。只有字符串中的每個字符(以及最後一個字符後面的位置)都經歷了這樣的過程之後還沒有成功匹配,正則表達式才會宣佈徹底失敗。

牢記這一過程將有助於判別那些影響正則表達式性能問題的類型。