Javascript Regex - 负面的lookbehind和lookahead

时间:2017-03-22 20:40:57

标签: javascript regex

我正在尝试将数据解析为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": "'是一个肮脏的解决方案......

2 个答案:

答案 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);
}));