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

use*_*038 2 regex json negative-lookbehind negative-lookahead

我有一些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" },
  ...
]
Run Code Online (Sandbox Code Playgroud)

我需要在"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" },
  ...
]
Run Code Online (Sandbox Code Playgroud)

我试着用正则表达式来替换(?!({ |": |", ))"(?!( }|: "|, "))'\\\\"',但我得到:

[
  { \"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" },
  ...
]
Run Code Online (Sandbox Code Playgroud)

请帮忙写一个正确的正则表达式.

Ste*_*han 5

试试这个正则表达式:

(?<![{,:] )"(?![:,]| })
Run Code Online (Sandbox Code Playgroud)

描述

正则表达式可视化

演示

http://regex101.com/r/tJ2dG0


讨论

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

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

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

(?<=[{,:] )"|"(?=[:,]| })
Run Code Online (Sandbox Code Playgroud)

正则表达式可视化

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

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

所以

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

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