正则表达式在前端开发中是非常重要、必须学习的一项技能。ES12 在 RegExp 中新增了一些有用的函数,让我们更方便地处理字符串,提高开发效率。
1. capture groups 的命名
在旧版 JS 中,我们使用正则表达式的捕获组,需要通过索引来访问。这种方式十分不灵活,也可以容易地出错。ES12 中,我们可以使用命名捕获组。命名捕获组使用“?<groupname>”格式,例如:
const regex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/; const result = regex.exec("2022-08-04"); console.log(result.groups.year); // "2022" console.log(result.groups.month); // "08" console.log(result.groups.day); // "04"
这样我们可以直接使用 result.groups.<groupname>
方式来返回对应的捕获组结果。如果正则匹配结果不包含指定的命名组,则返回值为 undefined
。
2. String.prototype.matchAll()
在旧版 JS 中,我们使用 match()
函数可以轻松地返回匹配正则表达式的所有结果。 ES12 中,我们新增了 matchAll()
函数。这个函数返回一个迭代器对象,可以在所有匹配结果上进行迭代。例如:
const regex = /(\d{4})-(\d{2})-(\d{2})/g; const str = "2022-08-04, 2022-08-05, 2022-08-06"; const matches = str.matchAll(regex); for (const match of matches) { console.log(match); }
输出结果:
[ '2022-08-04', '2022', '08', '04', index: 0, input: '2022-08-04, 2022-08-05, 2022-08-06', groups: undefined ] [ '2022-08-05', '2022', '08', '05', index: 11, input: '2022-08-04, 2022-08-05, 2022-08-06', groups: undefined ] [ '2022-08-06', '2022', '08', '06', index: 22, input: '2022-08-04, 2022-08-05, 2022-08-06', groups: undefined ]
可以看到,matchAll()
返回了一个迭代器对象。我们直接使用 for...of
循环即可迭代所有匹配结果。每次迭代返回的都是一个数组,里面包含了完整匹配值以及所有的捕获组。
3. String.prototype.replaceAll()
ES12 中,我们新增了 replaceAll()
函数,可以方便地实现全局替换字符串。例如:
const str = "Hello, World!"; const replaced = str.replaceAll("o", ""); console.log(replaced); // "Hell, Wrld!"
之前我们需要使用正则表达式,以 /g
模式来全局匹配替换。现在我们可以直接使用字符串,以简单优雅的方式来实现全局替换。
4. 小结
以上是 ES12 中 RegExp 新增的有用函数,全都是针对字符串处理的。这些函数都可以让我们更方便地处理字符串,代码更具可读性和可维护性。对于前端开发来说,掌握正则表达式以及 RegExp 新增的有用函数会大大提高开发效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67b85edd306f20b3a6615407