无法使用负前瞻的正则表达式来修复JSON中的非转义引号

时间:2014-01-21 12:08:44

标签: regex json negative-lookahead negative-lookbehind

我有以下格式的一些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" },
  ...
]

请帮助编写正确的正则表达式。

1 个答案:

答案 0 :(得分:5)

试试这个正则表达式:

(?<![{,:] )"(?![:,]| })

描述

Regular expression visualization

演示

http://regex101.com/r/tJ2dG0


讨论

首先,我假设您的正则表达式支持 lookbehind

其次,我怎么找到你说的这个正则表达式? 通常,当您构建正则表达式时,您可以构建它以匹配您想要的内容,也可以构建它以匹配您不想要的内容。我在这里使用后者。

这是匹配有效双引号的正则表达式:

(?<=[{,:] )"|"(?=[:,]| })

Regular expression visualization

演示: http://regex101.com/r/oX4uM5

正如您在演示中看到的那样,正则表达式(让我们称之为R)不会捕获无效引号。所以我们正在寻找的正则表达式是它(特定)相反(即!R)。 特别,因为我们将采用相反的外观(后面),而不是R中的引用。

所以

  • (?<=...)变为(?<!...)
  • (?=...)变为(?!...)
  • "|"(阅读" OR ")变为{" AND ""

因此最后的正则表达式在这个答案的顶部。