我有一个字符串[{"Id":"1","msg":""Lorem Ipsum""}],我只需要转义引号内的引号,就像这样的[{"Id":"1","msg":"\"Lorem Ipsum\""}]。我无法访问生成器代码进行修改,因此我正在寻找一种正则表达式解决方案或高效的Java解决方案。
我试着用\"[^\"]*?(\"*)[^\"]*?\"选择匹配,但没有用。任何帮助都是非常感谢的。提前谢谢。
请注意,不能保证模式总是两个双引号在一起,它也可以是这样的"Lorem "Ipsum" test",它应该变成"Lorem \"Ipsum\" test"。
附言:我已经看过Regular expression to escape double quotes within double quotes了
发布于 2013-06-20 20:29:08
问题所在
有限自动机-理论上等同于正则表达式-不能解析递归结构。由于您可以使用内部引号和可能的内部引号,因此您的问题不能使用正则表达式来解决。
尽管现代的正则表达式引擎可以通过几个扩展来克服这个问题,但不要浪费时间去寻找引号中的引号。您很快就会发现,您实际上是在构建一个成熟的JSON解析器。
作为@johnchen902 stated,即使是图灵机驱动的解析器也不能处理多义性-所以您最好不要尝试修复损坏的JSON。
解决方案
使用专用实用程序创建JSON
给定的字符串is not a valid JSON。它可能是使用字符串连接创建的,这通常不是一个好主意,因为它不能正确转义。您应该使用可以从Java数据结构构建JSON的JSON库,比如gson。创建一个对象列表,向其中添加一个对象对对象字典,并让库进行转义和转换。
要求创建者使用验证器
如果您从外部来源收到了字符串,那么请求一个可以使用的有效json是完全合法的。我猜创建者将String缝合在一起,这是构建结构化语言的错误方式。要求原始创建者使用标准库来创建JSON,或者至少使用验证器。所有现代编程语言都提供了这些机制。

发布于 2013-06-20 20:36:58
String escaped = str.replaceAll(":\"\"(.+?)\"\"([,}])", ":\"\\\\\"$1\\\\\"\"$2");https://stackoverflow.com/questions/17213468
复制相似问题