在 ES12 中引入了一个新的 String 方法 matchAll()
,它能够返回一个迭代器,遍历字符串中匹配某个正则表达式的所有结果。这个方法能够极大地简化字符串的处理和分析。
基本用法
matchAll()
方法用法和 match()
方法类似,但是前者返回的是一个迭代器对象,方便我们遍历所有匹配结果,而后者只返回第一个匹配结果。
-- -------------------- ---- ------- ----- --- - ------ ----- ------ ----- ----- - ------- -- -- ------- ----- ----- - ----------------- ------------------- -- --------- -------- ------- -- -- ---------- ----- -------- - -------------------- --------------------------- -- ----------- ---------- ---------
使用迭代器也可以实现上述目的:
const str = 'Hello world 2021'; const regex = /\w+/g; const matchAll = str.matchAll(regex); for (const match of matchAll) { console.log(match); // ['Hello'] / ['world'] / ['2021'] }
更进阶的使用
使用 lastIndex
属性
正则对象在匹配字符串的过程中,有个重要的属性 lastIndex
,它表示匹配下一个字符的位置。使用 match()
方法时,如果正则对象中包含了全局修饰符 g
,那么每一次调用 match()
方法时,lastIndex
属性值就会改变。
matchAll()
方法同样遵循这个规则,返回的迭代器对象也会受到 lastIndex
属性的影响。因此,如果想要遍历完整个字符串,需要每次手动设置 lastIndex
属性为 0。
-- -------------------- ---- ------- ----- --- - ------ ----- ---- ------ ----- ----- - ------- ----- --------- - -------------------- --- ------ ----- -- ---------- - ------------------- -- -------- - -------- - ----- --------- - -------------------- --- ------ ----- -- ---------- - ------------------- --------------- - -- - -- -------- - -------- - -------- - --------
记录匹配位置和输入字符串
迭代器对象中的每个元素都是一个数组,包含了匹配的字符串及其位置和输入字符串,可以通过数组解构获取这些信息。
const str = 'foo bar foo bar'; const regex = /foo/g; for (const [match, index, input] of str.matchAll(regex)) { console.log(match, index, input); // foo 0 'foo bar foo bar' / foo 8 'foo bar foo bar' }
处理捕获组
正则表达式中的捕获组是指放在圆括号中的子表达式,可以使用 matchAll()
方法来对捕获组进行处理。
-- -------------------- ---- ------- ----- --- - ------ - ----- --- ----- ------ - ------ -------- -- --- --- ------ ------- ----- ------ -- --------------------- - ------------------ ----- ------- -- ----- - - ----- - - ----- ------ - -------- -------- -- ---- --- ------ ------- ------ -- --------------------- - ------------------ ------- -- ----- - - ----- - -
结论
ES12 中新加入的 matchAll()
方法是一种强大而灵活的字符串处理工具,可以大大简化字符串的分析和处理。它通过返回迭代器对象,提供了更多的操作空间,比如处理匹配结果位置、输入字符串和捕获组等信息。但需要注意的是,在使用过程中要注意 lastIndex
属性的影响。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67061d9dd91dce0dc8587b63