学习前提

理解捕获组和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解释为捕获组。

进一步阅读