程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 解析正則表達式工作原理

解析正則表達式工作原理

編輯:關於PHP編程

正則表達式,是指一個用來描述或者匹配一系列符合某個句法規則的字符串的單個字符串。在很多文本編輯器或其他工具裡,正則表達式通常被用來檢索和/或替換那些符合某個模式的文本內容。

粗淺地編寫正則表達式是造成性能瓶頸的主要原因,但還有很多可以改進正則表達式效率的地方。兩個正則表達式匹配相同的文本並不意味著他們具有同等的速度。

許多因素影響正則表達式的效率,首先,正則表達式適配的文本千差萬別,部分匹配時比完全不匹配所用的時間要長。每種浏覽器的正則表達式引擎也有不同的內部優化。

為了有效地使用正則表達式,重要的是理解它們的工作原理。下面是一個正則表達式處理的基本步驟:

第一步:編譯

當你創建了一個正則表達式對象之後(使用一個正則表達式直接量或者RegExp構造器),浏覽器檢查你的模板有沒有錯誤,然後將它轉換成一個本機代碼例程,用於執行匹配工作。如果你將正則表達式賦給一個變量,你可以避免重復執行此步驟。

第二步:設置起始位置

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

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

第三步:匹配每個正則表達式的字元

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

第四步:匹配成功或失敗

如果在字符串的當前位置上發現一個完全匹配,那麼正則表達式宣布成功。如果正則表達式的所有可能路徑都嘗試過了,但是沒有成功地匹配,那麼正則表達式引擎回到第二步,從字符串的下一個字符重新嘗試。只有字符串中的每個字符(以及最後一個字符後面的位置)都經歷了這樣的過程之後,還沒有成功匹配,那麼正則表達式就宣布徹底失敗。
牢記這一過程將有助於您明智地判別那些影響正則表達式性能問題的類型。

原文地址: http://www.yiiyaa.net/1231


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved