JavaScript replace 方法通过正则表达式配合回调函数实现动态替换,回调接收匹配项、捕获组等参数并返回替换内容,支持按内容、位置、状态实时计算,如数字加一、HTML 实体解码、交替替换及结构化重组。

JavaScript 的 replace 方法本身不直接支持“动态替换策略”,但通过正则表达式配合回调函数,可以实现高度灵活、按需计算的替换逻辑。
用回调函数实现动态替换
当 replace 的第二个参数是函数时,该函数会在每次匹配时被调用,接收匹配项、捕获组、匹配位置、原始字符串等参数,返回值即为替换内容。这是实现动态逻辑的核心机制。
- 基础回调签名:
str.replace(/pattern/g, (match, p1, p2, offset, string) => {...}) -
match是完整匹配字符串,p1p2等是括号捕获的内容(如有) - 可基于匹配内容、位置、上下文甚至外部状态决定返回什么字符串
根据匹配内容实时计算新值
适合将数字加一、转大小写、查表映射等场景。例如把字符串中所有数字加 1:
"a1b2c3".replace(/\d/g, match => parseInt(match, 10) + 1)结果为 "a2b3c4"。再比如将 HTML 实体名转为字符:
立即学习“Java免费学习笔记(深入)”;
" ©".replace(/&(\w+);/g, (_, name) => { const entityMap = { nbsp: '\u00A0', copy: '\u00A9' }; return entityMap[name] || `&${name};`; })利用索引或全局状态控制替换行为
有时需要“第几次匹配才替换”或“交替替换”。可在回调外维护计数器或状态变量:
- 只替换第 2 个匹配:
let count = 0; str.replace(/x/g, () => ++count === 2 ? 'X' : 'x') - 奇偶交替:
str.replace(/x/g, () => (count++ % 2 ? 'X' : 'x')) - 注意:避免在回调中修改影响匹配的原始字符串(如重赋值
str),否则可能引发不可预期行为
结合正则捕获组做结构化替换
当模式含括号时,回调参数会依次接收各捕获组,便于提取并重组内容。例如格式化日期字符串 "2023-12-25" 为 "25/12/2023":
也可在回调中对捕获内容做条件判断,比如仅当月份大于 6 才转换格式。


















