Java中移除JSON字符串第一层转义的实现方法咨询
如何用replace()或replaceAll()移除Java字符串的第一层转义并保留嵌套转义?
可以用replaceAll()结合正则表达式实现这个需求,replace()因为只能做字面量替换,无法区分不同层级的转义,所以不适用。
问题回顾
原代码中的字符串定义:
private String jsonString = "{\\\"test\\\":\\\"value \\\\\"ciao\\\\\" \\\"}"
运行时实际值为:{\"test\":\"value \\\"ciao\\\" \"}
预期处理后结果:{"test":"value \"ciao\" "}
解决方案
核心思路是用正则的负向零宽断言,精准匹配那些仅被转义一次的双引号(即第一层转义的\"),同时跳过被转义两次的情况(\\\",对应最终要保留的\")。
代码示例:
String input = "{\\\"test\\\":\\\"value \\\\\\\"ciao\\\\\\\" \\\"}"; // 对应运行时的目标输入字符串 String output = input.replaceAll("(?<!\\\\)\\\\\"", "\""); System.out.println(output); // 输出:{"test":"value \"ciao\" "}
正则解释
(?<!\\\\):负向回顾断言,确保当前匹配位置的前一个字符不是反斜杠,以此排除掉\\\"中已经被转义过的反斜杠+引号组合\\\\\":匹配运行时字符串中的\"(Java字符串里反斜杠需要双重转义,所以正则里的\"在Java代码中要写成\\\\\")- 替换为
\"对应的实际字符"
这样就能精准移除第一层转义的双引号,同时保留嵌套的转义结构。
内容的提问来源于stack exchange,提问作者Paolo Mossini
相关产品推荐
相关产品推荐

