如何使用正则表达式将JSON字符串外层双引号替换为单引号并保留内层双引号
解决JSON字符串内层双引号导致解析失败的替换方案
你之前的正则是全局匹配所有双引号,没有区分结构位置和内容位置,所以会把所有双引号都替换成单引号。我们可以利用JSON结构的语法特征做匹配:只有紧挨着JSON结构符号({、[、:、,、}、])的双引号是外层的结构引号,值内部的双引号不会和这些符号相邻,所以只需要匹配这些位置的双引号替换为单引号即可。
具体实现代码
场景1:字符串为正常双引号格式
const dataString = '{"EN" : "2. This English "Blha Blha" "Woo Woo" something wrong."}'; // 匹配结构位置的双引号替换为单引号 const result = dataString.replace(/([{\[:,]\s*)"|"(\s*[}\],:])/g, "$1'$2");
场景2:字符串结构引号为HTML实体"
const dataString = '{"EN" : "2. This English "Blha Blha" "Woo Woo" something wrong."}'; const result = dataString.replace(/([{\[:,]\s*)"|"(\s*[}\],:])/g, "$1'$2");
结果验证
执行后得到的结果和预期完全一致:
{'EN' : '2. This English "Blha Blha" "Woo Woo" something wrong.'}
后续转对象方法
替换后的字符串已经不是标准JSON格式,不需要再用JSON.parse,可以直接转成JS对象:
const dataObj = new Function(`return ${result}`)();
注意事项
该方案适用于绝大多数常规业务场景,如果你的内容里存在值末尾刚好带JSON结构符号的极端情况,建议优先推动API提供方对返回内容里的特殊字符做转义,从源头上解决JSON格式问题。
内容的提问来源于stack exchange,提问作者Paing Htet Aung
相关产品推荐
相关产品推荐

