关于“用单反斜杠替换双反斜杠”或更一般地,“用\
不同的简单字符串替换包含 的简单字符串\
”的问题(这不完全是 OP 问题,而是其中的一部分):
该线程中的大多数答案都提到replaceAll
,这是此处工作的错误工具。更简单的工具是replace
,但令人困惑的是,OP 声明replace("\\\\", "\\")
对他不起作用,这也许就是所有答案都集中在replaceAll
.
给有 JavaScript 背景的人的重要提示:
请注意,replace(CharSequence, CharSequence)
在 Java 中确实替换了所有出现的子字符串 - 与 JavaScript 不同,它只替换第一个!
用指定的文字替换序列替换此字符串中与文字目标序列匹配的每个子字符串。
另一方面,replaceAll(String regex, String replacement)
更多文档也在这里- 将这两个参数视为比常规字符串更多:
请注意,替换字符串中的反斜杠 () 和美元符号 ($) 可能会导致结果与将其视为文字替换字符串时的结果不同。
(这是因为\
并且$
可以用作对捕获的正则表达式组的反向引用,因此如果您想按字面意思使用它们,则需要转义它们)。
换句话说, 和 的第一个和第二个参数的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"