我有一个字符串[{"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
了答案 0 :(得分:3)
有限自动机 - 正则表达式的理论等价物 - 无法解析递归结构。由于您可以使用内部引号和可能的内部引号,因此使用正则表达式无法解决您的问题。
虽然现代的正则表达式引擎可以通过几个扩展来克服这个问题,但不要浪费你的时间在引号内搜索引号。您很快就会发现,您实际上正在构建一个完整的JSON解析器。
作为@johnchen902 stated,即使是图灵机驱动的解析器也无法处理歧义 - 所以最好不要尝试修复损坏的JSON。
给定字符串is not a valid JSON。它可能是使用字符串连接创建的,这通常是一个坏主意,因为它无法正确转义。您应该使用可以从Java数据结构构建JSON的JSON库,例如gson。创建一个对象列表,向其中添加一个Object-to-Object字典,让库进行转义和转换。
如果您从外部来源收到了字符串,那么请求您可以使用的有效 json是完全合法的。我猜创作者将Strings拼接在一起,这是构建结构化语言的错误方法。请原始创建者使用标准库来创建JSON,或者至少使用验证器。所有现代编程语言都提供这些机制。
答案 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");