在 ES11 中,字符串匹配得到了新的升级,主要是引入了 String.prototype.matchAll() 方法。该方法可以在一个字符串中找到所有匹配给定正则表达式的子串,并返回一个迭代器。本文将详细探讨该方法的使用和一些常见应用场景。
方法语法
string.matchAll(regexp)
其中,string
表示要匹配的字符串,regexp
是一个正则表达式。
方法返回值
返回的是一个迭代器,迭代器指向的是匹配到的每一个子串。迭代器的每一项都是一个数组,数组的第一项为匹配到的子串,后面的项则是该子串被捕获到的值。如果有多个匹配结果,迭代器就会包含多个数组。
示例代码
下面的代码示例演示了如何使用 String.prototype.matchAll()
方法,同时也展示了它的返回值格式。假设我们要匹配一段文本中所有的 JavaScript 函数定义,代码如下:
const text = 'function hello() { /*...*/ } function world() { /*...*/ }'; const regex = /function\s+(\w+)\s*\(/g; const matches = text.matchAll(regex); for (const match of matches) { console.log(match); }
输出结果如下:
[ 'function hello() {', 'hello', index: 0, input: 'function hello() { /*...*/ } function world() { /*...*/ }', groups: undefined ] [ 'function world() {', 'world', index: 29, input: 'function hello() { /*...*/ } function world() { /*...*/ }', groups: undefined ]
我们可以看到,输出结果是一个迭代器对象,其中包含两个匹配项。每个匹配项都是一个数组,包含了匹配到的字符串和该字符串被捕获到的值。
应用场景
提取 URL 中的参数
假设我们有一个简单的 URL,如 https://www.example.com/path?foo=bar&baz=qux
,我们想从中提取出所有参数和值。我们可以使用正则表达式来匹配每个参数,然后使用 String.prototype.matchAll()
方法来提取它们。代码如下:
-- -------------------- ---- ------- ----- --- - ----------------------------------------------- ----- ----- - ----------------------- ----- ------- - -------------------- ----- ------ - --- --- ------ ----- -- -------- - ---------------- - --------- - -------------------- -- ------- - ---- ------ ---- ----- -
替换全部匹配项
String.prototype.replace()
方法只会替换第一个匹配项,而使用 String.prototype.matchAll()
方法则可以将字符串中所有匹配到的子串都替换掉,如下面的代码示例所示:
const text = '1 2 3'; const regex = /\d+/g; console.log(text.replace(regex, '$&$&')); // Output: '11 22 33'
结论
String.prototype.matchAll()
方法是一个实用的字符串匹配工具,可以帮助我们快速地在大量文本中查找和提取特定格式的字符串。同时,它也是一个非常容易使用的 API,只需要传入正则表达式即可得到需要的结果。如果你在日常工作中需要处理大量字符串,这个方法一定能给你带来很大的帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6717baaaad1e889fe2235df5