ES11(2020)String 扩展 String.prototype.matchAll()
Posted 优小U
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES11(2020)String 扩展 String.prototype.matchAll()相关的知识,希望对你有一定的参考价值。
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" ]
以上是关于ES11(2020)String 扩展 String.prototype.matchAll()的主要内容,如果未能解决你的问题,请参考以下文章
ES11(2020)Promise 扩展 allSettled()
ES11(2020)Promise 扩展 allSettled()