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()