matchAll获取所有正则匹配项需三点:正则必须带g标志,返回迭代器而非数组,每个匹配项含索引、输入字符串及捕获组等完整信息。

用 matchAll 获取所有正则匹配项,关键就三点:正则必须带 g 标志、它返回的是迭代器、每个匹配项包含完整信息(如捕获组、索引等)。
必须使用带 g 标志的正则表达式
不加 g 会直接报 TypeError,这是硬性要求,和 replace 或 replaceAll 不同——它们对 g 是可选的,但 matchAll 强制需要。
-
/hello/gi✅ 可用(全局 + 忽略大小写) -
/hello/i❌ 报错(缺g) -
new RegExp("hello", "gi")✅ 等效写法,也支持
结果是迭代器,不是数组
它不会一次性把所有匹配塞进内存,适合处理长文本或大量匹配场景。要用 for...of 遍历,或转成数组再操作:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
for (const m of str.matchAll(regex)) { console.log(m); }-
Array.from(str.matchAll(regex))→ 得到匹配数组 -
[...str.matchAll(regex)]→ 展开语法,效果同上
每个匹配项包含详细信息
每次迭代返回一个类似 match 的数组,但多了额外属性:
- 索引位置:
m.index是匹配起始下标 - 原始输入:
m.input是源字符串 - 捕获组:
m[1]、m[2]对应括号内的子匹配 - 如果正则带
d修饰符(ES2022+),还能用m.indices拿到每个组的起止位置
例如:'a1b2c3'.matchAll(/(\d)/g) 中,每个 m 是 ['1', '1'],m[0] 是完整匹配,m[1] 是第一个捕获组,m.index === 1 表示从下标 1 开始。
对比 match 和 exec 的优势
以前想拿全部匹配并带捕获组信息,得手动循环调用 exec 并维护 lastIndex,容易出错;match 带 g 虽能返回匹配字符串数组,但丢掉了索引和分组细节。matchAll 一步到位,逻辑更干净。

















