首页 文章

在双引号内转义双引号

提问于
浏览
3

我有一个字符串 [{"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
    String escaped = str.replaceAll(":\"\"(.+?)\"\"([,}])", ":\"\\\\\"$1\\\\\"\"$2");
    
  • 3

    问题

    A finite automaton - the theoretical equivalent of a regex - can't parse recursive structures . 由于您可以使用内部引号和可能的内部引号,因此使用正则表达式无法解决您的问题 .

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

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

    解决方案

    使用专用实用程序创建JSON

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

    要求创建者使用验证器

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

    enter image description here

  • 2

    不,你不能,因为一个字符串可能有几个含义 .

    例如:

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

    可能意味着

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

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

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

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

相关问题