在 ES11 中,JavaScript 新增了一种字符串方法:matchAll
。这个方法可以让我们更智能、高效地搜索字符串,找出符合指定模式的所有匹配项。本文将详细介绍 matchAll
的用法和特性,帮助你更好地理解和使用这个方法。
什么是 matchAll
matchAll
方法是字符串对象的一个方法,用于在字符串中搜索符合指定模式的所有匹配项,并返回一个迭代器。这个迭代器包含了所有匹配项的详细信息,包括匹配的文本、匹配的位置等等。
与其他字符串搜索方法(如 match
、search
等)不同的是,matchAll
返回的是一个迭代器,而不是一个数组或单个匹配项。这样可以更灵活地处理匹配项,避免了一次性获取所有匹配项可能带来的性能问题。
matchAll 的用法
matchAll
方法接收一个正则表达式作为参数,用于指定匹配模式。它返回一个迭代器,可以通过 for...of
循环来遍历所有匹配项。
const str = 'hello world, hello everyone'; const pattern = /hello/g; for (const match of str.matchAll(pattern)) { console.log(match); }
上面的代码会输出两个匹配项的信息:
["hello", index: 0, input: "hello world, hello everyone", groups: undefined] ["hello", index: 12, input: "hello world, hello everyone", groups: undefined]
每个匹配项都是一个数组,包含了匹配的文本、匹配的位置等信息。其中 index
表示匹配项在原字符串中的位置,input
表示原字符串本身。
除了 for...of
循环遍历,我们也可以使用 Array.from
方法将迭代器转换成数组,以便更方便地进行后续操作:
const str = 'hello world, hello everyone'; const pattern = /hello/g; const matches = Array.from(str.matchAll(pattern)); console.log(matches);
上面的代码会输出一个包含两个匹配项的数组。
matchAll 的特性
matchAll
方法有一些特性,让它更智能、高效地搜索字符串。
支持全局搜索
与 match
方法一样,matchAll
也支持全局搜索。只需要在正则表达式中使用 g
标志即可。
const str = 'hello world, hello everyone'; const pattern = /hello/g; for (const match of str.matchAll(pattern)) { console.log(match); }
上面的代码中,正则表达式 /hello/g
中的 g
标志表示全局搜索。这样就可以找出所有匹配项,而不仅仅是第一个匹配项。
支持捕获组
matchAll
方法还支持捕获组,可以在正则表达式中使用括号来定义捕获组。
// javascriptcn.com 代码示例 const str = '2021-05-01, 2022-01-01, 2023-12-25'; const pattern = /(\d{4})-(\d{2})-(\d{2})/g; for (const match of str.matchAll(pattern)) { console.log(match[0]); // 匹配的文本,如 "2021-05-01" console.log(match[1]); // 第一个捕获组,如 "2021" console.log(match[2]); // 第二个捕获组,如 "05" console.log(match[3]); // 第三个捕获组,如 "01" }
上面的代码中,正则表达式 /(\d{4})-(\d{2})-(\d{2})/g
中使用了三个括号来定义三个捕获组。每个匹配项都是一个数组,包含了匹配的文本和三个捕获组的值。
支持断言
matchAll
方法还支持断言,可以在正则表达式中使用 (?=...)
或 (?<=...)
等断言。
const str = 'hello world, hello everyone'; const pattern = /hello(?=\s)/g; for (const match of str.matchAll(pattern)) { console.log(match); }
上面的代码中,正则表达式 /hello(?=\s)/g
中使用了断言 (?=\s)
,表示只匹配后面跟着一个空格的 hello
。这样就可以排除掉 hello
后面没有空格的情况。
更高效的搜索
与其他字符串搜索方法(如 match
、search
等)不同的是,matchAll
返回的是一个迭代器,而不是一个数组或单个匹配项。这样可以更灵活地处理匹配项,避免了一次性获取所有匹配项可能带来的性能问题。
另外,matchAll
方法还支持在不同的字符串上进行多次搜索,可以避免重复创建正则表达式对象,提高了搜索的效率。
总结
matchAll
方法是 ES11 中新增的字符串方法,用于更智能、高效地搜索字符串。它支持全局搜索、捕获组、断言等特性,可以让我们更方便地处理匹配项。与其他字符串搜索方法相比,matchAll
返回的是一个迭代器,更灵活、高效,可以避免一次性获取所有匹配项可能带来的性能问题。希望本文能够帮助你更好地理解和使用 matchAll
方法。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/650bbb2e95b1f8cacd5d2907