在 JavaScript 中,我们经常需要使用正则表达式来进行字符串匹配。在 ES6 中,正则表达式的全局匹配功能被引入,可以使用 g
标志来进行全局匹配。但是,全局匹配在某些情况下可能会出现问题,比如无法获取到所有的匹配结果,或者无法获取到每个匹配的位置信息。为了解决这些问题,ES11 引入了 String.prototype.matchAll()
方法。
String.prototype.matchAll() 方法简介
String.prototype.matchAll()
方法是 ES11 中新增的一个字符串方法,它可以在一个字符串中查找所有匹配某个正则表达式的子字符串,并返回一个迭代器(Iterator)。这个迭代器包含了所有匹配结果的信息,包括匹配的子字符串、匹配的位置和正则表达式的捕获组。
使用 String.prototype.matchAll() 方法进行全局匹配
使用 String.prototype.matchAll()
方法进行全局匹配非常简单,只需要将正则表达式作为参数传入即可。下面是一个简单的示例:
const str = 'hello world, hello es11'; const regex = /hello/g; const matches = str.matchAll(regex); for (const match of matches) { console.log(match[0], match.index); }
上面的代码中,我们先定义了一个字符串 str
,然后定义了一个正则表达式 regex
,用来匹配字符串中的 hello
。接着,我们调用了 String.prototype.matchAll()
方法,并将正则表达式 regex
作为参数传入。matchAll()
方法返回的是一个迭代器,我们可以使用 for...of
循环来遍历这个迭代器。在每次遍历时,我们可以通过 match[0]
来获取匹配的字符串,通过 match.index
来获取匹配的位置。
获取正则表达式的捕获组
除了匹配的字符串和位置信息之外,String.prototype.matchAll()
方法还可以获取正则表达式的捕获组。捕获组是正则表达式中用括号括起来的部分,用来捕获匹配的子字符串。下面是一个示例:
const str = '2021-10-01'; const regex = /(\d{4})-(\d{2})-(\d{2})/; const matches = str.matchAll(regex); for (const match of matches) { console.log(match[0], match[1], match[2], match[3]); }
上面的代码中,我们定义了一个字符串 str
,然后定义了一个正则表达式 regex
,用来匹配日期格式。在正则表达式中,我们使用了三个捕获组,分别用来捕获年、月、日。接着,我们调用了 String.prototype.matchAll()
方法,并将正则表达式 regex
作为参数传入。在遍历迭代器时,我们可以通过 match[1]
、match[2]
、match[3]
来获取捕获组中的内容。
总结
String.prototype.matchAll()
方法是 ES11 中新增的一个字符串方法,它可以在一个字符串中查找所有匹配某个正则表达式的子字符串,并返回一个迭代器。使用 String.prototype.matchAll()
方法可以解决正则表达式全局匹配的一些问题,比如无法获取到所有的匹配结果,或者无法获取到每个匹配的位置信息。在遍历迭代器时,可以通过 match[0]
、match.index
、match[1]
、match[2]
、match[3]
等属性来获取匹配结果的信息。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65547e0ad2f5e1655de3eadb