跳到主要内容

JavaScript 字符串 matchAll() 方法

matchAll() 方法在字符串与正则表达式匹配后返回一个迭代器,包含所有匹配结果。

示例

// 字符串定义
const sentence = "JavaScript1JavaScript2";

// 包含 'JavaScript' 后跟一个数字的模式
const regex = /JavaScript\d/g;

// 在字符串中查找与给定正则表达式匹配的项
let results = sentence.matchAll(regex);

// 遍历迭代器
for (result of results) {
console.log(result);
}

// 输出:
// ["JavaScript1", index: 0, input: "JavaScript1JavaScript2", groups: undefined]
// ["JavaScript2", index: 11, input: "JavaScript1JavaScript2", groups: undefined]

matchAll() 语法

matchAll() 方法的语法为:

str.matchAll(regexp);

其中,str 是一个字符串。

matchAll() 参数

matchAll() 方法接受单个参数:

  • regex - 一个正则表达式对象(如果参数是非正则表达式对象,会隐式转换为 regex

注意:

  • 如果 regex 对象没有 /g 标志,则会抛出 TypeError
  • g 标志表示全局搜索,意味着此标志表示我们对字符串中所有匹配项测试正则表达式。

matchAll() 返回值

  • 返回一个包含匹配项及捕获组的迭代器。

注意:返回的迭代器的每个项将有以下额外属性:

  • groups - 具有命名捕获组的对象,键为名称,值为捕获到的匹配项。
  • index - 找到结果的搜索索引位置。
  • input - 搜索字符串的副本。

示例 1:使用 matchAll() 方法

// 字符串定义
const sentence = "I am learning JavaScript not Java.";

// 包含 'Java' 和任意数量的 a-z 字符的模式
const regex = /Java[a-z]*/gi;

// 在字符串中查找与给定正则表达式匹配的项
let result = sentence.matchAll(regex);

// 将结果转换为数组
console.log(Array.from(result));

输出

[
'JavaScript',
index: 14,
input: 'I am learning JavaScript not Java.',
groups: undefined
]
[
'Java',
index: 29,
input: 'I am learning JavaScript not Java.',
groups: undefined
]

在上述示例中,我们定义了一个带有 /g 标志的正则表达式 regex。然后我们在 sentence 中调用了 matchAll() 方法。

sentence.matchAll(regex) 将字符串 sentence 与模式匹配,该模式包含 'Java' 和任意数量的 a-z 字符。

该方法为给定的 regex 找到了两个匹配项 - 'JavaScript''Java'

注意: matchAll() 方法的结果以对象形式返回,所以我们使用了 Array.from(result) 将其转换为数组。

示例 2:matchAll() 中的区分大小写的 regex

正则表达式(regex) 是区分大小写的。我们可以在 matchAll() 方法中使用 i 标志来使其不区分大小写。例如:

// 字符串定义
const bio = "His name is Albert and albert likes to code.";

// 匹配 'albert' 或 'Albert' 的模式
const regex = /albert/gi;

// 在字符串中查找 'albert' 或 'Albert'
const result = bio.matchAll(regex);

console.log(Array.from(result));

输出

[
[
'Albert',
index: 13,
input: 'His name is Albert and albert likes to code.',
groups: undefined
],
[
'albert',
index: 24,
input: 'His name is Albert and albert likes to code.',
groups: undefined
]
]

在这里,我们在 regex 中使用了 i 标志和 g/albert/g),这使其不区分大小写。因此该方法返回包含两个迭代器的数组,找到的匹配项为 'Albert''albert'

推荐阅读: JavaScript String match()