match()不带g时返回完整匹配及捕获组数组,带g时仅返回所有完整匹配字符串;需捕获组与全局匹配共存应使用matchall()。

关键看正则是否带 g 标志,以及你是否需要捕获组内容——match() 无法兼顾全局匹配和捕获组,matchAll() 可以。
match():g 有无决定返回结构
不加 g 时,只取第一个匹配,但完整返回:首项是整体匹配字符串,后续每项对应一个捕获组(括号内容),还附带 index 和 input 属性。
-
"price: $123".match(/(\$\d+)/)→["$123", "$123"] -
"a1 b2".match(/(\w)(\d)/)→["a1", "a", "1", index: 0, input: "a1 b2"]
加了 g,就只返回所有完整匹配的字符串数组,捕获组被完全丢弃。
-
"a1 b2".match(/(\w)(\d)/g)→["a1", "b2"](不是二维数组,没有子组) - 哪怕正则里写了三对括号,
g下也只给你匹配到的原始字符串
matchAll():必须带 g,始终保留捕获细节
它不返回数组,而是一个迭代器,每次产出一个类似“不带 g 的 match()”结果的对象——含完整匹配、全部捕获组、index、input,甚至 groups(命名捕获)。
-
Array.from("a1 b2".matchAll(/(\w)(\d)/g))→[["a1","a","1",…], ["b2","b","2",…]] - 没 g 直接报错:
TypeError - 适合解析 URL 参数、日志行、结构化文本等需分组提取的场景
什么时候选哪个?
只找所有匹配的原始字符串(比如提取所有邮箱、电话)→ 用 match(/.../g),简洁够用。
要拆解每个匹配里的字段(比如从 "id=123&name=abc" 中分别取 key 和 value)→ 必须用 matchAll(/(\w+)=(\w+)/g)。
旧环境不支持 ES2020?可用 exec() 循环模拟 matchAll 行为,但代码更长。










