在双引号内转义双引号

时间:2013-06-20 12:18:01

标签: java regex json

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

我尝试选择与\"[^\"]*?(\"*)[^\"]*?\"匹配的内容是没用的。任何帮助都非常感谢。提前谢谢。

请注意,不能保证模式总是两个双引号,它也可以是"Lorem "Ipsum" test",它应该变为"Lorem \"Ipsum\" test"

PS:我已经看过Regular expression to escape double quotes within double quotes

3 个答案:

答案 0 :(得分:3)

问题

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

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

作为@johnchen902 stated,即使是图灵机驱动的解析器也无法处理歧义 - 所以最好不要尝试修复损坏的JSON。

解决方案

使用专用实用程序

创建JSON

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

要求创作者使用验证器

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

enter image description here

答案 1 :(得分:2)

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

例如:

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

可能意味着

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

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

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

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

答案 2 :(得分:0)

String escaped = str.replaceAll(":\"\"(.+?)\"\"([,}])", ":\"\\\\\"$1\\\\\"\"$2");