JavaScript 中的 exec() 方法用來檢索字串中的正規表示式的匹配,也即執行具體的正規表示式匹配操作。
exec() 的具體語法格式如下:
regpxp.exec(string)
regexp 表示正規表示式物件,引數 string 是要檢索的字串。
exec() 將返回一個陣列,其中存放匹配的結果。如果為找到匹配結果,則返回 null。
返回陣列的第 1 個元素是與正規表示式相匹配的文字,第 2 個元素是與正規表示式的第 1 個子表示式相匹配的文字(如果有的話),第 3 個元素是與正規表示式的第 2 個子表示式相匹配的文字(如果有的話),以此類推。
除了陣列元素和 length 屬性之外,exec() 方法還會返回下面兩個屬性。
-
index:匹配文字的第一個字元的下標位置。
-
input:存放被檢索的原型字串,即引數 string 自身。
在非全域性模式下,exec() 方法返回的陣列與 String.match() 方法返回的陣列是相同的。
在全域性模式下,exec() 方法與 String.match() 方法返回的結果不同。當呼叫 exec() 方法時,會為正規表示式物件定義 lastIndex 屬性,執行執行下一次匹配的起始位置,同時返回匹配陣列,與非全域性模式下的陣列結構相同;而 String.match() 僅返回匹配文字組成的陣列,沒有附加資訊。
因此,在全域性模式下獲取完整的匹配資訊只能使用 exec() 方法。
當 exec() 方法找到了與表示式相匹配的文字後,會重置 lastIndex 屬性為匹配文字的最後一個字元下標位置加 1,為下一次匹配設定起始位置。因此,通過反復呼叫 exec() 方法,可以遍歷字串,實現全域性匹配操作,如果找不到匹配文字時,將返回 null,並重置 lastIndex 屬性為 0。
範例
在下面範例中,定義正規表示式,然後呼叫 exec() 方法,逐個匹配字串中每個字元,最後使用 while 語句顯示完整的匹配資訊。
var s = "JavaScript"; //測試使用的字串直接量
var r = /w/g; //匹配模式
while ((a = r.exec(s))) { //迴圈執行匹配操作
console.log("匹配文字 = " + a[0] + " a.index = " + a.index + " r.lastIndex = " + r.lastIndex); //顯示每次匹配後返回的陣列資訊
}
在 while 語句中,把返回結果作為迴圈條件,當返回值為 null 時,說明字串檢測完畢,立即停止疊代;否則繼續執行。在迴圈體內,讀取返回陣列 a 中包含的匹配結果,並讀取結果陣列的 index 屬性,以及正規表示式物件的 lastIndex 屬性,演示效果如圖所示。