You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JSON对象中替换多个正则表达式匹配项(ECMA5环境)

解决ECMA5环境下批量替换JSON中{{标签}}的问题

问题分析

当前代码仅能替换第一个{{window.location.xxx}}格式的标签,开启正则全局标志(g)后失效,核心原因:

  • 未加g时,match()返回单个匹配的结果数组(包含捕获组),但replace()仅执行一次替换
  • 加上g后,match()返回所有完整匹配的字符串数组,不再包含捕获组信息,此时取[1]会导致错误
  • 原逻辑仅处理单个匹配项,无法批量替换所有标签

修正方案(ECMA5兼容)

利用String.replace()的函数式替换参数(ECMA5原生支持),遍历所有匹配项并逐一替换:

var Obj = {
  hostname: "Test 1 {{window.location.hostname}}",
  protocol: "Test 2 {{window.location.protocol}}"
};
var myObj = JSON.stringify(Obj);
// 开启全局匹配标志g
var regex = /\{\{window\.location\.(.+?)\}\}/g;

// 用函数作为replace的第二个参数,处理每个匹配项
var _Obj = myObj.replace(regex, function(fullMatch, propName) {
  // propName对应正则捕获的属性名(如hostname、protocol)
  return window.location[propName];
});

console.log(JSON.parse(_Obj));

关键说明

  1. 全局匹配:正则添加g标志,确保replace()遍历所有匹配的标签
  2. 函数式替换:每次匹配时,函数会收到完整匹配字符串和捕获组内容,直接通过属性访问获取对应值,避免原代码中Function构造函数的安全风险
  3. ECMA5兼容性:String.replace()的函数参数在ECMA5中已被SpiderMonkey支持,无需额外兼容处理

内容的提问来源于stack exchange,提问作者David Garcia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 05:53:20