天天看點

JS程式設計建議——43:使用exec增強正規表達式功能

建議43:使用exec增強正規表達式功能

RegExp對象定義了兩個用于執行模式比對操作的方法,它們的行為與String對象的正規表達式操作方法類似。例如,RegExp對象的exec方法與String對象的match方法相似,隻不過exec是以字元串為參數的RegExp對象方法,而match方法是以正規表達式為參數的String對象方法。在非全局模式下,它們的傳回值是相同的。

在所有RegExp模式比對方法和String模式比對方法中,exec方法的功能最強大。作為正規表達式的通用比對方法,exec方法比RegExp.test()、String.search()、String.replace()和String.match()都複雜。該方法需要一個參數,用來執行要執行操作的字元串并傳回一個數組,此數組中存放的是比對結果。如果沒有找到比對的文本,傳回值為null。例如:

var s = "javascript";

var r = /java/g;

var a = r.exec(s); //["java"]

exec方法的工作機制是這樣的:當調用方法時,先檢索字元串參數,從中擷取與正規表達式相比對的文本。如果找到了比對的文本,就會傳回一個數組;否則,傳回null。對傳回數組的元素的具體說明如下:

第0個元素,是與表達式相比對的文本。

第1個元素,是與正規表達式的第1個子表達式相比對的文本(如果存在)。

第2個元素,是與正規表達式的第2個子表達式相比對的文本,依此類推。

傳回數組還包含幾個屬性,具體說明如下:

length,該屬性聲明的是數組中的元素個數。

index,該屬性聲明的是比對文本的第一個字元的位置。

input,該屬性包含的是整個字元串。

當調用非全局模式的正規表達式對象的exec方法時,傳回的數組與調用字元串對象的match方法傳回的數組是完全相同的。

當執行全局比對模式時,exec的行為就略有變化。這時它會定義lastIndex屬性,以指定下一次執行比對時開始檢索字元串的位置。在找到了與表達式相比對的文本之後,exec方法将把正規表達式的lastIndex屬性設定為下一次比對執行的第一個字元的位置。也就是說,可以通過反複地調用exec方法來周遊字元串中的所有比對文本。當exec再也找不到比對的文本時,将傳回null,并且把屬性lastIndex重置為0。

在下面的這個示例中,定義正規表達式直接量,用來比對字元串s中每個字元。在循環結構的條件表達式中反複執行比對模式,并将傳回結果的值是否為null作為循環條件。當傳回值為null時,說明字元串檢測完畢。然後,讀取傳回數組a中包含的比對子字元串,并調用該數組的屬性index和lastIndex,其中index顯示目前比對子字元串的起始位置,而lastIndex屬性顯示下一次比對操作的起始位置。例如:

var s = "javascript"; // 測試使用的字元串直接量

var r = /w/g; // 比對模式

while((a = r.exec(s)) != null){ // 循環執行比對操作

}

實際上通過循環結構反複調用exec方法是唯一獲得全局模式的完整模式比對資訊的方法。

無論正規表達式是否為全局模式,exec方法都會将完整的細節添加到傳回數組中。字元串對象的match方法就不同,它在全局模式下傳回的數組中不會包含這麼多的細節資訊。