正则表达式替换JSON字符串中的特殊字符不起作用

时间:2017-01-19 01:16:04

标签: javascript json

我难过......

http://codepen.io/anon/pen/rjjGEE

为什么正则表达式javascript字符串替换为具有特殊字符的字符串,但不是转换为字符串的对象?

let regex = /[\t\r\n]/g

var directString = "{'name':{'first':' billy bob ','last':'\n\rjoe\tblow'}}"
console.log(directString.replace(regex, "a"));

//Output: "{'name':{'first':' billy bob ','last':'aajoeablow'}}"


let obj = {
      name: {
        first: " billy bob  ",
        last: "\n\rjoe\tblow"
      },

    }

let objAsString = JSON.stringify(obj);
let stringifiedString = objAsString.replace(regex, "a")
console.log(stringifiedString)

//Output: "{'name':{'first':' billy bob  ','last':'\n\rjoe\tblow'}}"

//??? Why isn't \n\r and \t being replaced????

2 个答案:

答案 0 :(得分:4)

当你在字符串常量中使用\n\t之类的转义符时(就像你的第一个例子),你最终得到的是一个包含预期特殊字符(换行符或制表符)的字符串。

但是,当您对对象进行JSON编码时,您最终得到的是一个包含转义序列本身的字符串,而不是特殊字符。 JSON.stringify()所做的工作必须包括确保JSON的后续解析将重新创建所有字符串值对象属性的原始值。因此,它将字符串 back 中的嵌入特殊字符转换为转义序列。您的正则表达式正在查找特殊字符,而不是转义序列。

答案 1 :(得分:1)

不要尝试使用regexp操作JSON字符串。疼痛随之而来。

相反,这样做:

var jsonString = String.raw`{"a": "foo\nbar\rbaz\tqux"}`;

var replaced = JSON.stringify(JSON.parse(jsonString, (key, value) =>
      typeof value === 'string' ?  value.replace(/[\t\r\n]/g, '') : value
    ));
                                         
console.log(replaced);