十分钟了解 ES11 新增的 String.prototype.matchAll 方法

前言

在 JavaScript 中,字符串是一种常见的数据类型。字符串有很多方法可用于处理和转换,其中 match() 方法可以用于返回所有匹配某个正则表达式的子字符串。但是,match() 方法只能够匹配一次,如果我们需要匹配所有符合条件的子字符串,该如何处理呢?ES11 中新增了 String.prototype.matchAll() 方法来解决此类问题,本文将会详细介绍该方法的使用、特性及其示例代码进行解析。

什么是 String.prototype.matchAll 方法?

String.prototype.matchAll() 方法是 ES11 新增的一种字符串匹配方法。该方法可以用于查找所有符合某个正则表达式的字符串,并以一个迭代器的形式返回结果。该方法返回一个迭代器对象,可用 for...of 循环逐一遍历每一个匹配结果。

String.prototype.matchAll 方法的语法

String.prototype.matchAll() 方法的语法如下:

str.matchAll(regexp)

其中 str 为要匹配的字符串,regexp 为要匹配的正则表达式。该方法返回一个迭代器对象,该对象是由一个或多个数组组成的,每个数组都包含 match 及捕获组的信息,可以使用 for...of 循环逐一遍历每个匹配结果。

String.prototype.matchAll 方法的特性

String.prototype.matchAll() 方法具有以下特性:

  1. 此方法返回一个迭代器对象,该对象由一个或多个数组组成,每个数组都包含匹配和每个分组的信息。
  2. 如果没有找到任何匹配项,则返回的迭代器没有任何元素。
  3. 如果在全局匹配时没有找到匹配项,那么匹配器会在正则表达式上的 lastIndex 属性后面添加一个偏移量,该偏移量将用于下一次搜索。
  4. 返回的迭代器对象包含了符合条件的所有字符串的数组,按照出现次序排序。

String.prototype.matchAll 方法的示例代码

让我们来看一下 String.prototype.matchAll() 方法的一些示例代码:

const str = "Hello, my name is John. I live in New York. I was born in 2000.";

const regexp = /\b[a-z]+\b/g;

for (const match of str.matchAll(regexp)) {
  console.log(match[0]);
}

此代码中,我们需要匹配字符串 str 中的所有单词。为了完成此操作,我们使用正则表达式 /\b[a-z]+\b/g 来获取所有单词。通过遍历 str.matchAll(regexp) 来进一步处理获得的

匹配结果,我们可以使用 for...of 循环逐个输出所匹配到的单词,结果如下:

"Hello"
"my"
"name"
"is"
"John"
"I"
"live"
"in"
"New"
"York"
"I"
"was"
"born"
"in"
"2000"

此外,我们还可以使用迭代器的 next() 方法,并通过正则表达式的 lastIndex 属性来获取下一个匹配结果:

const str = "hannah likes bananas";

const regexp = /[a-z]/g;

const iterator = str.matchAll(regexp);

console.log(iterator);

console.log(iterator.next().value); // Array(1) ["h"]
console.log(iterator.next().value); // Array(1) ["a"]
console.log(iterator.next().value); // Array(1) ["n"]
console.log(iterator.next().value); // Array(1) ["n"]
console.log(iterator.next().value); // Array(1) ["a"]
console.log(iterator.next().value); // Array(1) ["l"]
console.log(iterator.next().value); // Array(1) ["i"]
console.log(iterator.next().value); // Array(1) ["k"]
console.log(iterator.next().value); // Array(1) ["e"]
console.log(iterator.next().value); // Array(1) ["s"]
console.log(iterator.next().value); // Array(1) ["b"]
console.log(iterator.next().value); // Array(1) ["a"]
console.log(iterator.next().value); // Array(1) ["n"]
console.log(iterator.next().value); // undefined

在此示例中,我们首先创建了一个正则表达式 /[a-z]/g 来获取字符串 str 中的所有小写字母。之后,我们通过 str.matchAll(regexp) 方法获取匹配到的所有字符串,得到一个迭代器对象 iterator。接下来,我们使用 next() 方法逐一获取迭代器中的每一个匹配的结果。可以看到,每次调用 next() 方法,都会返回一个包含匹配的字符串的数组。通过正则表达式的 lastIndex 属性,我们可以看到下一个匹配结果的位置。

总结

String.prototype.matchAll 是 JavaScript 中字符串匹配的一个新方法,可以用于查找所有符合某个正则表达式的字符串,并以一个迭代器的形式返回,可以大大提高字符串类型的数据处理效率。尤其是当需要匹配大量的数据集合时,String.prototype.matchAll 更是一个不可或缺的数据处理方法。同时,由于它是一个计算资源较大的执行过程,所以一定要在遍历的过程中进行使用,小心谨慎,在合适的场景使用可让代码更加简洁、迭代速度更快。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65937b15eb4cecbf2d831d5c


纠错反馈