JavaScript RegExp exec()

RegExp 物件的 exec() 方法用來搜尋匹配的字串,如果找到會返回一個陣列 (array),陣列的第一個元素是匹配的字串,第二個之後的元素則是匹配的群組 (capturing groups);如果沒找到東西則返回 null。

語法:

regexObj.exec(str)

用法:

var re = /quick\s(brown).+?(jumps)/ig;

// ["Quick Brown Fox Jumps", "Brown", "Jumps"]
var result = re.exec('The Quick Brown Fox Jumps Over The Lazy Dog');

上面 exec() 返回的結果 result 是一個陣列,陣列的第一個元素是匹配的字串 "Quick Brown Fox Jumps",第二個之後的元素則是匹配群組 "Brown" 和 "Jumps"。

result 還有兩個屬性:

  • result.index 表示匹配到的字串在原始字串的索引位置,在這例子中其值是 4。
  • result.input 表示原始字串,其值是 "The Quick Brown Fox Jumps Over The Lazy Dog"。

至於 RegExp 物件 re 也有幾個可用的屬性:

  • re.lastIndex 表示下一次執行 exec() 時,從哪開始找起的索引位置,在這例子中其值是 25。但如果 g flag 沒有開啟則 re.lastIndex 會固定是 0。
  • re.ignoreCase 是一個 boolean 值,用來判斷 i flag 有沒有開啟,在這例子中其值是 true。
  • re.global 是一個 boolean 值,用來判斷 g flag 有沒有開啟,在這例子中其值是 true。
  • re.multiline 是一個 boolean 值,用來判斷 m flag 有沒有開啟,在這例子中其值是 false。
  • re.source 用來取得 pattern 的內容,在這例子中其值是 "quick\s(brown).+?(jumps)"。

遍歷所有匹配的字串 (Finding successive matches)

如果你的正規表示式有開啟 g flag,你可以連續執行 exec() 多次來逐一取得原始字串中所有的匹配字串,每次執行完 exec() 都會重設 lastIndex 為匹配字串後面接續的字元的索引位置。

例子:

var re = /ab*/g;
var str = 'abbcdefabh';
var ary;

while ((ary = re.exec(str)) !== null) {
    var msg = 'Found ' + ary[0] + '. ';
    msg += 'Next match starts at ' + re.lastIndex;
    console.log(msg);
}

上面的程式執行後會依序輸出:

Found abb. Next match starts at 3
Found ab. Next match starts at 9

RegExp literal

你也可以直接用 RegExp literal 的方式執行 exec():

var matches = /(hello \S+)/.exec('This is a hello world!');

// ["hello world!", "hello world!"]
matches;