讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議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){//循環執行匹配操作

alert(a[0]+"\n"+a.index+"\n"+r.lastIndex);/*顯示每次匹配操作時返回的結果數組信息*/

}


實際上通過循環結構反覆調用exec方法是唯一獲得全局模式的完整模式匹配信息的方法。

無論正則表達式是否為全局模式,exec方法都會將完整的細節添加到返回數組中。字符串對象的match方法就不同,它在全局模式下返回的數組中不會包含這麼多的細節信息。