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;