在 ES2020 中,新增了一个 String 原型中的 matchAll 方法,它可以返回一个迭代器对象,来对字符串进行全局匹配,它是一个非常强大的字符串处理工具。本文将详细介绍 matchAll 方法的使用和注意事项。
基本使用方法
matchAll 方法的基本用法很简单,它接收一个正则表达式作为参数,然后返回一个迭代器对象,你可以用 for...of 循环来遍历这个对象,获取所有匹配到的结果。
const str = 'hello world 1 2 3'; const regEx = /\d+/g; const matches = str.matchAll(regEx); for(const match of matches) { console.log(match); }
以上代码中,我们用正则表达式 \d+/g 对字符串进行全局匹配,然后将匹配结果赋值给变量 matches。接下来我们用 for...of 循环来遍历 matches 迭代器对象,获取每个匹配结果并将其打印到控制台上。
注意事项
matchAll 方法虽然功能强大,但也需要注意一些使用细节。下面是几个需要注意的点:
正则表达式必须是全局匹配模式
matchAll 方法只对全局匹配模式进行匹配,如果你传入的正则表达式不是全局匹配模式,那么它只会匹配第一项。比如:
const str = 'hello world 1 2 3'; const regEx = /\d+/; const matches = str.matchAll(regEx); for(const match of matches) { console.log(match); }
以上代码中,我们传入了一个非全局匹配的正则表达式,在遍历迭代器对象时,只会返回匹配到的第一个匹配项。
matchAll 方法返回的迭代器对象是惰性的
matchAll 方法返回的迭代器对象是惰性的(lazy),也就是说只有在你遍历它时,它才会去匹配字符串并返回匹配项。如果你没有遍历迭代器对象,那么它不会进行任何匹配操作,也不会返回任何结果。我们来看下面的示例:
-- -------------------- ---- ------- ----- --- - ------ ----- - - --- ----- ----- - ------- ----- ------- - -------------------- -- ------------ --------------------- --------- ----- -- -------- - ------------------- -
以上代码中,我们将匹配结果赋给了 matches 变量,并在 console.log 中打印出来,但是你会发现并没有输出任何东西。这是因为迭代器对象是惰性的,只有在 for of 循环中循环时才会进行字符串匹配。
迭代器对象只能遍历一次
matchAll 方法返回的迭代器对象只能遍历一次,如果你需要多次遍历,并且使用 for of 循环,那么你需要将它转换为数组进行操作。示例代码如下:
-- -------------------- ---- ------- ----- --- - ------ ----- - - --- ----- ----- - ------- ----- ------- - -------------------------------- --------- ----- -- -------- - ------------------- - --------- ----- -- -------- - ------------------- -
在以上代码中,我们先将迭代器对象转换为数组,然后进行两次遍历。
总结
matchAll 方法在字符串处理方面提供了很大的便利性,可以帮助我们快速找到需要的结果。它需要注意正则表达式必须是全局匹配模式、迭代器对象是惰性的,以及迭代器对象只能遍历一次这些细节问题。熟练掌握 matchAll 方法,对于前端开发者来说是非常必要的技能之一。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645c8214968c7c53b0ee94b9