带反斜杠的Java replaceAll

带反斜杠的Java replaceAll,java,escaping,Java,Escaping,对于这个简单的程序 import java.lang.String; public class test { public static void main(String[] argv) { String s = "Hello <BSLASH>"; String sReplaced = s.replaceAll("<BSLASH>", "\\\\"); System.out.println("s = " +

对于这个简单的程序

import java.lang.String;

public class test {

    public static void main(String[] argv) {

        String s = "Hello <BSLASH>";
        String sReplaced = s.replaceAll("<BSLASH>", "\\\\");

        System.out.println("s = " + s);
        System.out.println("sReplaced = " + sReplaced);

    }
}
import java.lang.String;
公开课考试{
公共静态void main(字符串[]argv){
字符串s=“Hello”;
字符串sreplace=s.replaceAll(“,“\\\”);
System.out.println(“s=“+s”);
System.out.println(“sreplace=“+sreplace”);
}
}
为什么sreplace不等于Hello\\2个反斜杠

$javac test.java
$ java test
s = Hello <BSLASH>
sReplaced = Hello \
$javac test.java
$java测试
你好
你好\

您应该总共使用8个反斜杠来获得2个反斜杠。单反斜杠应该用一个反斜杠来逃脱,反斜杠是一个元字符是正则表达式世界,为了考虑它是一个正常字符,你必须用两个反斜杠来避免它。

 String sReplaced = s.replaceAll("<BSLASH>", "\\\\\\\\");
String sreplace=s.replaceAll(“,”);

由于replaceAll使用regex,它实际上会将四个斜杠转义为两个斜杠,那么反斜杠的转义就是另一个反斜杠

所以你的代码实际上只是\

要将其替换为两个反斜杠,应为

String sReplaced = s.replaceAll("<BSLASH>", "\\\\\\\\");
String sreplace=s.replaceAll(“,”);

不要使用
replaceAll
为此,请使用
replace

String sReplaced = s.replace("<BSLASH>", "\\\\");
String sreplace=s.replace(“,“\\\”);
replaceAll
采用正则表达式,这里不需要正则表达式(这就是为什么
\\\\\
的计算结果为
\


哦,你真的不需要
导入java.lang.String
-默认情况下导入
String
类。

我还建议使用
替换
而不是
替换所有
。 我在这里写了一段代码来解决这个问题,并试图解释如何在java字符串中使用反斜杠

String bs1="\\";
String bs2="\\";
String sReplaced = s.replace("<BSLASH>", bs1.concat(bs2));
String bs1=“\\”;
字符串bs2=“\\”;
字符串sreplace=s.replace(“,bs1.concat(bs2));

这对我来说确实有效。谢谢谢谢你也解释了正则表达式的部分。@Kevin很高兴我能帮忙:-)别忘了接受答案。默认情况下导入的不仅仅是
String
,而是整个
java.lang
包,好像每个程序都有
import java.lang.*在开始时。@Kevin上述操作在windows上非常有效。可能您正在使用linix。@GangnamStyleOverflower这不应该有什么区别,但您所拥有的应该可以工作并产生
Hello\\
@a.R.S。但是,我测试了它并得到了*Hello\*作为输出,您怎么说?@GangnamStyleOverflower,它对您有用还是不有用?@Kevin如前所述,它在我的输出'Hello\\\\`@Kevin中工作得非常好。上述功能在windows上工作得非常好。也许你正在使用linix。是的,Ubuntu。这有什么关系?Java不是跨平台的吗?顺便说一句,这并不重要。不管怎样,我很确定这是可行的,因为我在多个操作系统中测试了它。我有mac、centos、ubuntu和WindowsVista,它们的输出都是一样的。很高兴ARS能解决您的问题我感谢您的回复,但我相信添加2个变量和串联会带来不必要的复杂性。