ES10 新增了 String.prototype.matchAll() 方法
在 ES10 中,新增了 String.prototype.matchAll() 方法,这个方法返回一个正则表达式在当前字符串中匹配到的所有结果,以及一些额外的信息。该方法的返回值为一个迭代器,可以使用 for-of 循环来遍历所有匹配结果。
该方法的语法如下:
str.matchAll(regexp)
其中,str 表示当前字符串,regexp 表示要匹配的正则表达式。
下面我们来看一个简单的示例,假设我们要从一个字符串中找出所有的数字:
const str = 'foo bar 123 baz 456 qux'; const regexp = /\d+/g; const result = str.matchAll(regexp); for (const match of result) { console.log(match); }
Output:
["123", index: 8, input: "foo bar 123 baz 456 qux", groups: undefined] ["456", index: 16, input: "foo bar 123 baz 456 qux", groups: undefined]
从输出结果可以看出,matchAll() 方法返回的是一个迭代器,可以遍历所有匹配结果,每个结果是一个数组,其中包含匹配的字符串、匹配字符串的索引、原始字符串以及一些额外的信息。
不过,与其他语言的 regexp.matchAll() 方法不同,在 JavaScript 中,如果正则表达式包含具名捕获组,则 matchAll() 方法会返回一个迭代器,其中包含一个 groups 属性,它是一个对象,其中包含所有具名捕获组的键值对,即具名捕获组的名称作为键,捕获的值作为值。
下面是一个具名捕获组的示例:
const str = '2021-09-01'; const regexp = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/; const result = str.matchAll(regexp); for (const match of result) { console.log(match.groups); }
Output:
{year: "2021", month: "09", day: "01"}
这里的正则表达式包含了三个具名捕获组:year、month 和 day,这个示例可以输出:
{year: "2021", month: "09", day: "01"}
总结
String.prototype.matchAll() 方法在匹配正则表达式时返回迭代器,以遍历字符串中的每个匹配项,包括捕获组。该方法是 ES9 中的 lexical match,但比它更强大,因为它允许我们直接访问捕获组。
如果您需要从字符串中提取一些特定的数据,而不想把整个字符串分割成单词或几个子字符串然后尝试提取您需要的内容,那么 matchAll() 方法是一种非常有用的工具。
感谢您的阅读,期待您在使用 ES10 String.prototype.matchAll() 方法时发现更多的用途。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648c5d1e48841e9894ab6bb5