我难过......
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????
答案 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);