2

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

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

4

1 回答 1

5

试试这个正则表达式:

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

描述

正则表达式可视化

演示

http://regex101.com/r/tJ2dG0


讨论

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

其次,我是如何找到你所说的这个正则表达式的?通常,当您构建正则表达式时,您要么构建它以匹配您想要的东西,要么构建它来匹配您不想要的东西。我在这里使用后者。

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

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

正则表达式可视化

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

正如您在演示中看到的那样,正则表达式(我们称之为R)不会捕获无效引号。所以我们正在寻找的正则表达式是它的(特别)相反的(即!R)。特别是因为我们将采用与look(behind|ahead)相反的方式,而不是inside 的引用R

所以

  • (?<=...)变成(?<!...)
  • (?=...)变成(?!...)
  • "|"(读)简单地" OR "变成( )" AND ""

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

于 2014-01-21T12:37:13.957 回答