在实际项目开发中,经常会遇到需要替换字符串的情况,简单的使用replace替换指定的一种字符串相信处理起来基本都没啥问题,但遇到一些比较复杂的替换字符串的场景如:需要替换多个不同的字符串,每次正则匹配出来后都要替换成不同的字符串,处理起来实现思路可能就会有些困惑!

实战应用场景:
拿到一后端转义过的字符串,需要将该字符串转换成JSON格式再做后续的业务处理,该字符串格式结构如下:

{"app_params":"{ \"aid\": 6666 }"}

试错做法:

var str = '{"app_params":"{ \"aid\": 6666 }"}';
     var strToJson=JSON.parse(str);
     console.log(strToJson);然后就看到了最不想看到的红色报错:
 
VM86:1 Uncaught SyntaxError: Unexpected token a in JSON at position 18 at JSON.parse ()


大致意思是说遇到非预期的语法错误:意外的标记,导致JSON.parse执行失败,直白点说就是提供的字符串不符合标准的JSON格式,无法按预期转换为JSON输出。

分析下字符串:
\" 该转义字符串会自动替换输出",即原始字符串实际是这样的:


{"app_params":"{ "aid": 6666 }"}


单击展开代码,方便阅读

要能正常转换成JSON,在转换前必须将字符串替换处理为:


{"app_params":{ "aid": 9442 }}


单击展开代码,方便阅读

即需要替换2种字符:"{=>{ 和 }"=>},实现代码如下:

var str='{"app_params":"{ \"aid\": 6666 }"}';
     str = str.replace(/"\{/g, '{');
     str = str.replace(/"\}/g, '}');
     console.log(`替换后字符串:${str}`);
     strToJson = JSON.parse(str);
     console.dir(`转JSON后: ${strToJson}`);

多次调用replace正则替换看上去没啥毛病,但若遇到需要替换更多个不同字符串的时候,随着使用replace个数的添加,你会觉得这样的代码显得累赘,不够优雅,不够“高大上”!!
强迫症都出来了,不能忍!!!
replace同时正则匹配替换多个不同字符串,改造后的写法:

var str = '{"app_params":"{ \"aid\": 6666 }"}';
     console.log(`原始字符串:${str}`);
     str = str.replace(/("\{|"\})/gi, function (matchStr, p1) {
         console.log(`当前匹配到的子字符串:${p1}`)
         // 将正则匹配到的子字符串作为索引key,返回对象字面量value(该value为要替换后的字符串)
         return {
             '"{': '{',
             '"}': '}',
         }[p1] //
     })
     console.log(`替换后字符串:${str}`);
     strToJson = JSON.parse(str);
     console.dir(`转JSON后: ${strToJson}`);

注意看注释,有没一种豁然开朗的感觉!