ES11 中新增的 String.prototype.matchAll() 方法详解

在ES11中,JavaScript新增了一个非常实用的字符串方法——String.prototype.matchAll()。这个方法可以用于在字符串中查找所有匹配某个正则表达式的子串,而不仅仅是第一个匹配项。本文将详细介绍这个方法的用法、示例及其指导意义。

语法

String.prototype.matchAll(regexp)

其中,regexp为一个正则表达式。

返回值

返回一个迭代器,迭代器中包含每个匹配项的详细信息。

用法

基本用法

----- --- - ------ -------
----- ------ - -----
----- ------- - ---------------------

--- ------ ----- -- -------- -
  -------------------
-

输出结果:

- ---- ------ -- ------ ------ ------- ------- --------- -
- ---- ------ -- ------ ------ ------- ------- --------- -

该例子中,我们在字符串 str 中查找所有匹配正则表达式 /l/g 的子串。由于正则表达式中有 g 标志,因此我们可以找到所有匹配项。使用 matchAll() 方法,我们可以得到一个迭代器,通过 for...of 循环遍历每个匹配项,并输出其详细信息。这里的详细信息包括匹配到的字符串、字符串中的位置、输入的字符串及其分组信息。

获取所有分组信息

----- --- - -------------
----- ------ - --------------------------
----- ------- - ---------------------

--- ------ ----- -- -------- -
  -------------------
  --------------------- --------- ----------
-

输出结果:

- ------------- ------- ----- ----- ------ -- ------ ------------- ------- --------- -
---- -- --

该例子中,我们在字符串 str 中查找所有匹配正则表达式 /(\d{4})-(\d{2})-(\d{2})/ 的子串。由于正则表达式中有分组,因此我们可以获取每个匹配项的分组信息。通过 match[1]match[2]match[3] 获取每个匹配项的年、月、日信息。

处理多行字符串

----- --- - ------ ----
------ ----
----- ------
----- ------ - --------------------
----- ------- - ---------------------

--- ------ ----- -- -------- -
  -------------------
-

输出结果:

- ------ ------ -------- ------- ------ -- ------ ------ ------------ ----------- ------ ------- --------- -
- ------- ------ --------- ------- ------ --- ------ ------ ------------ ----------- ------ ------- --------- -

该例子中,我们在多行字符串 str 中查找所有匹配正则表达式 /^(\w+)\s+(\w+)$/gm 的子串。由于正则表达式中有 m 标志,因此我们可以处理多行字符串。通过 match[1]match[2] 获取每个匹配项的第一个单词和第二个单词。

指导意义

String.prototype.matchAll() 方法的出现,使得我们可以更加方便地处理字符串中的匹配项。这个方法返回的迭代器可以让我们逐个处理每个匹配项,获取其详细信息,以及处理分组等操作。这使得我们在处理字符串时更加高效和灵活。

总结

本文介绍了 ES11 中新增的 String.prototype.matchAll() 方法的用法、示例及其指导意义。该方法可以用于在字符串中查找所有匹配某个正则表达式的子串,而不仅仅是第一个匹配项。这个方法的出现,使得我们在处理字符串时更加高效和灵活。

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