学习前提
理解捕获组和JavaScript回调;能处理字符串和数组。
本课完成后你能做什么
使用matchAll提取字段,以替换函数完成可预测转换。
先理解机制
matchAll返回迭代器,正则参数必须带g。每次结果包括整体匹配、捕获字段和索引,比match的全局模式更适合需要捕获组的提取。
replace的字符串替换值中,$1、$&等有特殊含义。回调返回的字符串按结果文本使用,适合用户提供的字面替换值,避免把其中美元符号误当替换指令。
本例将简单键值对提取成数组,再把日期外形从YYYY-MM-DD转换为DD/MM/YYYY。转换日期外形不是校验真实日历;2026-02-31仍需要额外的日期验证。
可运行示例
const pairs = [..."a=12 b=7".matchAll(/([a-z])=(\d+)/g)]
.map(m => [m[1], Number(m[2])]);
console.log(JSON.stringify(pairs));
console.log("2026-09-29".replace(/^(\d{4})-(\d{2})-(\d{2})$/, (_, y, m, d) => d + "/" + m + "/" + y));
const literalReplacement = "$&";
console.log("a.b".replace(/\./g, () => literalReplacement));
console.log("a.b".replace(/\./g, literalReplacement));
推演与验证
提取得到a对应12、b对应7。日期输出29/09/2026。回调替换得到a$&b,普通字符串替换把$&解释为原匹配点号,仍为a.b。
常见错误与边界
动态搜索词不应未经处理直接拼入正则。若需求就是替换固定字符串,可以用字符串形式的replaceAll并配合回调,而不是先构造正则。
动手练习
把所有点号改成字面量$1,预测输出。
参考解法与理由
使用"a.b.c".replaceAll(".", () => "$1"),得到a$1b$1c。既不用转义搜索点号,也不会把$1解释为捕获组。