我有以下格式的一些JSON代码:
[
{ "abc ": "d ef", "g": "h i", "jk lm no": "pq", "r st": "uvw xyz" },
{ "!1 2": " 3", "4 ": "5 6 7", " 8 ": "9 abc", "def": "hi "NAME" jk" },
...
]
我需要在“NAME”中的引号前添加反斜杠才能正确解析此JSON。所以我需要上面的字符串看起来像这样:
[
{ "abc ": "d ef", "g": "h i", "jk lm no": "pq", "r st": "uvw xyz" },
{ "!1 2": " 3", "4 ": "5 6 7", " 8 ": "9 abc", "def": "hi \"NAME\" jk" },
...
]
我尝试使用正则表达式将(?!({ |": |", ))"(?!( }|: "|, "))
替换为'\\\\"'
,但我得到了:
[
{ \"abc ": \"d ef", \"g": \"h i", \"jk lm no": \"pq", \"r st": \"uvw xyz" },
{ \"!1 2": \" 3", \"4 ": \"5 6 7", \" 8 ": \"9 abc", \"def": \"hi \"NAME\" jk" },
...
]
请帮助编写正确的正则表达式。
答案 0 :(得分:5)
试试这个正则表达式:
(?<![{,:] )"(?![:,]| })
首先,我假设您的正则表达式支持 lookbehind 。
其次,我怎么找到你说的这个正则表达式? 通常,当您构建正则表达式时,您可以构建它以匹配您想要的内容,也可以构建它以匹配您不想要的内容。我在这里使用后者。
这是匹配有效双引号的正则表达式:
(?<=[{,:] )"|"(?=[:,]| })
演示: http://regex101.com/r/oX4uM5
正如您在演示中看到的那样,正则表达式(让我们称之为R
)不会捕获无效引号。所以我们正在寻找的正则表达式是它(特定)相反(即!R
)。 特别,因为我们将采用相反的外观(后面),而不是R
中的引用。
所以
(?<=...)
变为(?<!...)
(?=...)
变为(?!...)
"|"
(阅读" OR "
)变为{" AND "
)"
因此最后的正则表达式在这个答案的顶部。