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()的主要内容,如果未能解决你的问题,请参考以下文章

ES6中字符串的新增方法梳理

ES11(2020)Promise 扩展 allSettled()

ES11(2020)Promise 扩展 allSettled()

ES11的新特性:String 的 matchAll 方法 import() 动态导入语句等

es6 字符串String的扩展

ES8(2017)String扩展 padStart / padEnd