matchall 是 javascript 中处理全局正则匹配最干净、最可靠的方式,强制 g 标志避免静默失败,保留全部捕获组与元数据,惰性求值内存友好,天然支持现代语法与链式操作。

matchAll 是 JavaScript 中处理全局正则匹配最干净、最可靠的方式。它不是 match 的简单升级,而是针对真实开发痛点重新设计的现代 API。
强制 g 标志,避免静默失败
matchAll 要求传入的正则必须带 g 标志,否则直接抛出 TypeError。这杜绝了因漏写 g 导致只取到第一个匹配的低级失误。
- match(/a/, "abac") → ["a"](只匹配一次,容易误以为全量)
- matchAll(/a/, "abac") → 报错,立刻暴露问题
- matchAll(/a/g, "abac") → 正常返回两个匹配项的迭代器
保留全部捕获组与元数据
每个匹配结果都是标准的 RegExpExecArray,不仅有 [0](整个匹配),还有 [1]、[2](各捕获组)、index(起始位置)、input(原始字符串)、groups(命名捕获)等字段。
- 对
/(\d+)-(\w+)/g匹配"123-abc 456-def": - match →
["123-abc", "456-def"](丢失分组) - matchAll → 每次迭代得到
["123-abc", "123", "abc", index: 0, ...]和["456-def", "456", "def", index: 8, ...]
惰性求值,内存友好
返回的是迭代器,不是一次性生成的大数组。遍历时才逐次计算,适合处理大文本或流式场景。
-
"x".repeat(1e6).match(/x/g)→ 立即分配百万长度数组 -
"x".repeat(1e6).matchAll(/x/g)→ 迭代器本身几乎不占内存 - 配合
for...of可边匹配边处理,比如日志逐行解析、AST 构建
天然支持现代语法与链式操作
迭代器可直接用于 for...of、展开运算符 [...it]、Array.from(),再接 map、filter 等方法,逻辑清晰无副作用。
- 无需手动维护
lastIndex,告别易错的while (match = regex.exec(str))循环 - 不污染正则实例状态,多次调用互不影响
- 配合 TypeScript,编译期就能检查正则是否带 g、分组是否被正确引用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











