在 ECMAScript 2021 (ES12) 中,JS 又引入了一个新的 String 原型方法 -- String.prototype.matchAll()
, 该方法可以使得当我们需要在字符串中找到所有符合某种规则的子字符串时,更便捷地进行处理。本文将详细解释该方法的使用,包含示例代码。
API 定义
在 String.prototype 上添加了一个新的 matchAll 方法,其 API 定义如下:
String.prototype.matchAll(regexp)
参数:
参数 | 描述 |
---|---|
regexp | 必传参数,可以是一个正则表达式,也可以是一个字符串。 |
返回值:
- 一个由 RegExp.prototype.exec() 返回值组成的 iterator。
特点
- 返回迭代器,可进行循环
- 适用于全局匹配的正则表达式
示例
下面举一个例子,有一个字符串 const text = 'Hello world! This is a text string.'
,现在需要查找其中所有的单词(单词的定义是:连续的英文字母或数字)。我们使用循环匹配的方式来尝试解决这个问题。
const text = 'Hello world! This is a text string.'; const regex = /\w+/g; while ((result = regex.exec(text))) { console.log(result[0]); }
输出的结果:
Hello world This is a text string
这种实现的方式是使用 RegExp.prototype.exec()
方法循环执行,在每次执行完后更新正则表达式的 lastIndex 属性,以便接下来从该位置开始查找下一个匹配。然而使用这种方法容易遗漏一些匹配,需要多次调试和更新正则表达式,还要检查 lastIndex 属性的设置是否正确,比较繁琐。
现在我们尝试用 String.prototype.matchAll()
方法来实现同样的功能:
const text = 'Hello World! This is a text string.'; const regex = /\w+/g; const matches = text.matchAll(regex); for (const match of matches) { console.log(match[0]); }
输出的结果:
Hello world This is a text string
String.prototype.matchAll()
方法返回一个迭代器,只要使用 for…of 循环即可取出其中所有的元素。此外,用这种方法还可以直接访问 match 的属性,无需像前面的例子中频繁使用数组下标。
总结
String.prototype.matchAll()
方法是一个很实用的字符串查找工具,能够更方便地从字符串中查找符合某些规则的子字符串,不需要手动循环和更新正则表达式,提高了开发效率。如果你经常需要在字符串中查找符合某些规则的子字符串,那么这个方法可以让你的代码更加简洁易懂。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64fc1571f6b2d6eab32063c0