在 ECMAScript 2020(ES11)中,新增了一个非常实用的方法:String.prototype.matchAll。该方法可以在字符串中查找所有匹配正则表达式的子字符串,并返回一个迭代器对象。
用法
String.prototype.matchAll 方法接收一个正则表达式作为参数,并返回一个迭代器对象。我们可以通过 for...of 循环来遍历迭代器对象,获取所有匹配结果。
const str = 'Hello World!'; const regExp = /\w+/g; const matches = str.matchAll(regExp); for (const match of matches) { console.log(match); }
输出结果为:
["Hello", index: 0, input: "Hello World!", groups: undefined] ["World", index: 6, input: "Hello World!", groups: undefined]
每个匹配结果都是一个数组,包含匹配到的子字符串、匹配到的位置、原始字符串和未命名捕获组。
指导意义
String.prototype.matchAll 方法的出现,解决了在 ES6 中 String.prototype.match 方法的一个限制。在 ES6 中,String.prototype.match 方法只能返回第一个匹配结果。如果我们需要获取所有匹配结果,就需要使用一个循环来重复调用该方法。
const str = 'Hello World!'; const regExp = /\w+/g; let match; while ((match = regExp.exec(str)) !== null) { console.log(match); }
输出结果和上面的示例代码相同:
["Hello", index: 0, input: "Hello World!"] ["World", index: 6, input: "Hello World!"]
String.prototype.matchAll 方法的出现,让获取所有匹配结果变得更加简单和直观。
示例代码
下面是一些使用 String.prototype.matchAll 方法的示例代码。
获取所有匹配结果
const str = 'Hello World!'; const regExp = /\w+/g; const matches = str.matchAll(regExp); for (const match of matches) { console.log(match); }
获取所有匹配结果的位置
const str = 'Hello World!'; const regExp = /\w+/g; const matches = str.matchAll(regExp); for (const match of matches) { console.log(match.index); }
获取所有匹配结果的长度
const str = 'Hello World!'; const regExp = /\w+/g; const matches = str.matchAll(regExp); for (const match of matches) { console.log(match[0].length); }
使用捕获组
const str = '2022-01-01'; const regExp = /(\d{4})-(\d{2})-(\d{2})/; const matches = str.matchAll(regExp); for (const match of matches) { console.log(match[1], match[2], match[3]); }
输出结果为:
2022 01 01
总结
String.prototype.matchAll 方法的出现,让获取所有匹配结果变得更加简单和直观。如果我们需要在字符串中查找所有匹配正则表达式的子字符串,可以使用该方法来实现。同时,我们也可以使用捕获组来获取匹配结果中的特定部分。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/655d1389d2f5e1655d75be92