我正在尝试将数据解析为JSON。数据如下所示:
[{
'Id': 1,
'FirstName': 'bob',
'LastName': '',
'Description': 'description can include escaped single quotes: \'.'
}]
结果如何:
[{
"Id": 1,
"FirstName": "bob",
"LastName": "",
"Description": "description can include escaped single quotes: \'."
}]
重点是用双引号替换所有未转义的单引号,同时单独保留转义引号。
我有正则表达式,它已经很好地将单引号转换为JSON的双引号,而忽略了转义的单引号。
/((?!\\).{1}|^.{0,0})\'/g
问题:问题是,对于位'LastName': ''
,它只会将第一个引号替换为“而不是第二个......将其替换为:{{1}这是无效的JSON。
问题:如何修改我的正则表达式以确保替换单个引号?我觉得连续两次运行"LastName": "'
是一个肮脏的解决方案......
答案 0 :(得分:2)
我认为将您的数据存储在JavaScript变量中并使用JSON.stringify将是实现您尝试执行的操作的最佳方式。它将为您提供逃避特殊角色的功能,您不必继续维护正则表达式来处理更多场景。
obj=[{ 'Id': 1, 'FirstName': 'bob', 'LastName': '', 'Description': 'description can include escaped single quotes: \'.'}]
str=JSON.stringify(obj)

在此之后你的str将具有这个值:[{" Id":1," FirstName":" bob"," LastName&#34 ;:"","说明":"说明可以包含转义单引号:'。"}]
答案 1 :(得分:1)
javascript不支持Lookbehind。你也无法做出积极的前瞻。有一种更可靠的方法可以做到这一点,而不用考虑外观:
var str = str = `[{
'Id': '',
'FirstName': 'bo\\\\\\\\'b',
'LastName': '',
'Description': 'des\\\\\\'cription can\\\\' include \\\\\\\\'escaped\\'single quotes: \\'.'
}]`;
console.log(str.replace(/(\\\\)+(')|\\+'|(')/g, function(match, p1, p2, p3) {
return p2 ? p1 + '\\"' : (p3 ? '"' : match);
}));