3

我有一个字符串[{"Id":"1","msg":""Lorem Ipsum""}],我需要像这样转义引号内的引号[{"Id":"1","msg":"\"Lorem Ipsum\""}]。我无权访问生成器代码来修改,所以我正在寻找正则表达式解决方案或高效的 Java 解决方案。

我尝试选择 \"[^\"]*?(\"*)[^\"]*?\"没有用的匹配项。非常感谢任何帮助。提前致谢。

请注意,不能保证模式总是两个双引号在一起,它也可以是这样"Lorem "Ipsum" test"的,应该变成"Lorem \"Ipsum\" test".

PS:我已经看过正则表达式以在双引号内转义双引号

4

3 回答 3

3

问题

有限自动机 - 正则表达式的理论等价物 - 无法解析递归结构。由于您可以使用内部引号和可能的内部内部引号,因此无法使用正则表达式解决您的问题。

尽管现代正则表达式引擎可以通过几个扩展来克服这个问题,但不要浪费时间在引号内寻找引号。您很快就会发现您实际上正在构建一个成熟的 JSON 解析器。

正如@johnchen902 所说,即使是图灵机驱动的解析器也无法处理歧义 - 所以你最好不要尝试对损坏的 JSON 提出修复建议。

解决方案

使用专用实用程序创建 JSON

给定的字符串不是有效的 JSON。它可能是使用字符串连接创建的,这通常是个坏主意,因为它不能正确转义。您应该使用可以从 Java 数据结构构建 JSON 的 JSON 库,例如gson。创建一个对象列表,向其中添加一个对象到对象的字典,然后让库进行转义和转换。

要求创建者使用验证器

如果您从外部来源收到了字符串,那么请求您可以使用的有效json 是完全合法的。我猜是创建者将字符串拼接在一起,这是构建结构化语言的错误方法。要求原始创建者使用标准库来创建 JSON,或者至少使用验证器。所有现代编程语言都提供这些机制。

在此处输入图像描述

于 2013-06-20T12:29:07.633 回答
2

不,你不能,因为一个字符串可能有多种含义。

例如:

[{"Id":"1","msg":""Lorem Ipsum""}]

五月的意思

[{"Id":"1","msg":""Lorem Ipsum""}]

也就是说,它可以被转义(解析)为

[{"Id":"1\",\"msg\":\"\"Lorem Ipsum\""}]

除非给出更多规则,否则程序无法确定其含义。

于 2013-06-20T12:36:55.283 回答
0
String escaped = str.replaceAll(":\"\"(.+?)\"\"([,}])", ":\"\\\\\"$1\\\\\"\"$2");
于 2013-06-20T12:36:58.327 回答