matchAll()
方法返回一个包含所有匹配正则表达式的结果及分组捕获组的迭代器。
const regexp = /t(e)(st(\d?))/g;
const str = 'test1test2';
const array = [...str.matchAll(regexp)];
console.log(array[0]);
// ["test1", "e", "st1", "1"]
console.log(array[1]);
// ["test2", "e", "st2", "2"]
语法:str.matchAll(regexp)
在 matchAll
出现之前,通过在循环中调用regexp.exec()
来获取所有匹配项信息(regexp
需使用 /g
标志):
const regexp = RegExp('foo[a-z]*','g');
const str = 'table football, foosball';
let match;
while ((match = regexp.exec(str)) !== null) {
console.log(`Found ${match[0]} start=${match.index} end=${regexp.lastIndex}.`);
// expected output: "Found football start=6 end=14."
// expected output: "Found foosball start=16 end=24."
}
如果使用matchAll
,就可以不必使用 while
循环加exec
方式(且正则表达式需使用/g
标志)。使用 matchAll
会得到一个迭代器的返回值,配合for...of
, array spread
, 或者 Array.from()
可以更方便实现功能:
const regexp = RegExp('foo[a-z]*','g');
const str = 'table football, foosball';
const matches = str.matchAll(regexp);
for (const match of matches) {
console.log(`Found ${match[0]} start=${match.index} end=${match.index + match[0].length}.`);
}
Array.from(str.matchAll(regexp), m => m[0]);
// Array [ "football", "foosball" ]
如果没有/g
标志,matchAll
会抛出异常。
matchAll
内部做了一个 regexp 的复制,所以不像 regexp.exec
, lastIndex
在字符串扫描时不会改变。
const regexp = RegExp('[a-c]','g');
regexp.lastIndex = 1;
const str = 'abc';
Array.from(str.matchAll(regexp), m => `${regexp.lastIndex} ${m[0]}`);
// [ "1 b", "1 c" ]