在双引号内转义双引号

Posted

技术标签:

【中文标题】在双引号内转义双引号【英文标题】:Escape double quotes within double quotes 【发布时间】:2013-06-17 07:11:35 【问题描述】:

我有一个字符串["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

【问题讨论】:

将链接问题中的解决方案移植到 Java 时发生了什么? 它并没有像我上面显示的那样逃脱。它只是返回了初始字符串 【参考方案1】:

问题

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

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

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

解决方案

使用专用实用程序创建 JSON

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

请创建者使用验证器

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

【讨论】:

我认为 OP 想知道如何以编程方式逃避这一点。 它甚至无法被解析器解析,因为一个字符串可能有多种含义。例如,请参阅我的答案。 @johnchen902 正确,但至少可以验证并选择任意数量的可能解释之一。关键是它没有用 - OP 应该创建或接收有效的 JSON,而不是修复损坏的字符串。 不错的解决方案@AdamMatan【参考方案2】:

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

例如:

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

五月的意思

["Id":"<b><i>1","msg":""Lorem Ipsum"</i></b>"]

即可以转义(解析)为

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

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

【讨论】:

【参考方案3】:
String escaped = str.replaceAll(":\"\"(.+?)\"\"([,])", ":\"\\\\\"$1\\\\\"\"$2");

【讨论】:

以上是关于在双引号内转义双引号的主要内容,如果未能解决你的问题,请参考以下文章

引号嵌套

正则表达式匹配双引号内的每个字符串并包含转义引号

关于引号的总结

python - 在双引号内添加变量,变量也包含双引号

输入反映在双引号之间的标记参数内是啥意思?

单引号内双引号内转义单引号[重复]