天天看點

JS程式設計建議——38:正确認識正規表達式工作機制

建議38:正确認識正規表達式工作機制

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

第1步,編譯。在建立了一個正規表達式對象後,浏覽器先要檢查模闆有沒有錯誤,然後将它轉換成一個本機代碼例程,用于執行比對工作。如果将正規表達式賦給一個變量,就可以避免重複執行此步驟。

第2步,設定起始位置。當一個正規表達式投入使用時,要先确定目标字元串中開始搜尋的位置。它是字元串的起始位置,或者由正規表達式的lastIndex 屬性指定,但當它從第4步傳回到這裡的時候,此位置将位于最後一次嘗試起始位置推後一個字元的位置上。

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

第3步,比對每個正規表達式的字元。正規表達式一旦找好起始位置,将會一個個地掃描目标文本和正規表達式模闆。當一個特定字元比對失敗時,正規表達式将試圖回溯到掃描之前的位置上,然後進入正規表達式其他可能的路徑。

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

牢記這一過程将有助于判别那些影響正規表達式性能問題的類型。

繼續閱讀