关于“用单反斜杠替换双反斜杠”或更一般地,“将包含\的简单字符串替换为包含\的不同简单字符串”的问题(这不完全是OP问题,但它的一部分):
这个帖子中的大多数答案都提到了replaceAll,这是一个错误的工具。更简单的工具是replace,但令人困惑的是,OP 声明replace("\\\\", "\\") 对他不起作用,这可能就是为什么所有答案都集中在replaceAll 上。
对于有 JavaScript 背景的人的重要提示:
请注意,Java 中的 replace(CharSequence, CharSequence) 确实替换了所有出现的子字符串 - 与 JavaScript 不同,它只替换第一个!
用指定的文字替换序列替换此字符串中与文字目标序列匹配的每个子字符串。
另一方面,replaceAll(String regex, String replacement) -- 更多文档 also here -- 将这两个参数视为比常规字符串更多:
请注意,替换字符串中的反斜杠 () 和美元符号 ($) 可能会导致结果与将其视为文字替换字符串时的结果不同。
(这是因为\ 和$ 可以用作对捕获的正则表达式组的反向引用,因此如果要按字面意思使用它们,则需要转义它们。
换句话说,replace 和 replaceAll 的第一个和第二个参数的行为不同。对于replace,您需要将两个参数中的\ 加倍(字符串文字中反斜杠的标准转义),而在replaceAll 中,您需要将其加倍! (标准字符串转义 + 函数特定转义)
总结一下,对于简单的替换,应该坚持replace("\\\\", "\\")(只需要转义一个,不需要转义两个)。
https://ideone.com/ANeMpw
System.out.println("a\\\\b\\\\c"); // "a\\b\\c"
System.out.println("a\\\\b\\\\c".replaceAll("\\\\\\\\", "\\\\")); // "a\b\c"
//System.out.println("a\\\\b\\\\c".replaceAll("\\\\\\\\", "\\")); // runtime error
System.out.println("a\\\\b\\\\c".replace("\\\\", "\\")); // "a\b\c"
https://www.ideone.com/Fj4RCO
String str = "\\\\u003c";
System.out.println(str); // "\\u003c"
System.out.println(str.replaceAll("\\\\\\\\", "\\\\")); // "\u003c"
System.out.println(str.replace("\\\\", "\\")); // "\u003c"