如何在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));
关键说明
- 全局匹配:正则添加
g标志,确保replace()遍历所有匹配的标签 - 函数式替换:每次匹配时,函数会收到完整匹配字符串和捕获组内容,直接通过属性访问获取对应值,避免原代码中
Function构造函数的安全风险 - ECMA5兼容性:
String.replace()的函数参数在ECMA5中已被SpiderMonkey支持,无需额外兼容处理
内容的提问来源于stack exchange,提问作者David Garcia
相关产品推荐
相关产品推荐

