java字符串replaceAll";至\ \“;

java字符串replaceAll";至\ \“;,java,replaceall,Java,Replaceall,我想替换“in my string to\\”以供Javascript JSON.parse(…)以后使用,我尝试以下测试 String name = "\"ab\"c"; System.out.println("name before escape="+name); String name1 = name.replaceAll("\"", "\\\""); System.ou

我想替换“in my string to\\”以供Javascript JSON.parse(…)以后使用,我尝试以下测试

String name = "\"ab\"c";
System.out.println("name before escape="+name);
String name1 = name.replaceAll("\"", "\\\"");
System.out.println("name1="+name1);
String name2 = name.replaceAll("\"", "\\\\\"");
System.out.println("name2="+name2);
String name3 = name.replaceAll("\"", "\\\\\\\"");
System.out.println("name3="+name3);
结果如下:

name before escape="ab"c
name1="ab"c
name2=\"ab\"c
name3=\"ab\"c
所以都失败了,我不理解输出结果

  • 为什么名称2和名称3是相同的
  • 如何替换所有“to\\”
  • [更新1}

    对于问题2,我发现了以下工作

    System.out.println("name4=" + name.replaceAll("\"", Matcher.quoteReplacement("\\\\\"")));
    

    尽管我对它的工作原理感到迷惘…

    不要使用
    replaceAll
    ,使用
    replace
    name.replace(“\”,“\\\”);
    原因是
    replaceAll
    使用regex,它会弄乱所有格式

    主类{
    公共静态void main(字符串[]args){
    字符串名称=“\”ab\“c”;
    字符串名称1=name.replace(“\”,“\”);
    System.out.println(name1);//Prints:\\“ab\\”c
    }
    }
    
    最好使用
    replace()
    而不是
    replaceAll()

    输出:

    name before escape="ab"c
    name1=\\"ab\\"c
    

    使用replaceAll需要转义\and“

    String name=“\”ab\“c”;
    System.out.println(“转义前的名称=”+name);
    String name1=name.replaceAll(“\\\”,“\\”);
    System.out.println(“name1=“+name1”);
    
    不要构建自己的JSON。使用一个库。我们这里有很多关于堆栈溢出的JavaScript问题,询问如何修复格式错误的JSON(这通常几乎是不可能的)因为他们从中获取的源代码没有正确编码。请不要犯这样的错误。另外,您确切想要的输出是什么?@ivar任何库推荐?@OlivierGrégoire我想要的输出是\\“ab”\\“cYou可以使用Jackson、Gson或JSON java。如果您只想编码一个字符串,那么您可以使用它。但是如果它是更大的JSON的一部分,那么您也可以。但是如果我想使用replaceAll,那么如何编写?以及如何解释我问题中name1、name2和name3的结果?不,这个输出name1=\\\\\\\\\\\\\\\\\\\\\\\\”c必须更新答案,name.replaceAll(“\\\”,“\\\”)但是可以解释为什么会这样做吗?有9个反斜杠,前三个\\\,因为\在java和regex中有特殊的含义,所以一个反斜杠需要在esapce中再添加两个反斜杠,所以从左到右,前六个反斜杠输出\\,但是如何解释剩余的第七、第八、第九个反斜杠加上双引号\\\“?2 string和regex string中的escape。string定义“\\\\\\\\\\\\\\\\\\\”、\“->”,所以原始字符串是\\\\\”。在regex string中也需要escape,所以\\->,\“->”,所以它是\\“第一个是java escape,所以第二个反斜杠意味着一个反斜杠,第三、第四、第二、第五、第六、第七、第八个是剩余的\”“,所以原始字符串是四个反斜杠加上一个双引号\\\”,然后在正则表达式中,第一个反斜杠和第二个反斜杠输出一个反斜杠,第三个、第四个反斜杠输出第二个反斜杠,所以becomes\\“你是说这个吗?
    name before escape="ab"c
    name1=\\"ab\\"c