下面的代码用完全限定类名中的反斜杠替换所有点(可以是任何字符串)。
String str=Test.class.getName().replaceAll("\\.", "\\\\") + ".class";
System.out.println(str);替换字符串需要四个反斜杠。
假设替换字符串是文件路径中的分隔符,我希望使用java.io.File.separator使其独立于不同的操作系统。
String separator=File.separator+File.separator
String str=Test.class.getName().replaceAll("\\.", separator) + ".class "
System.out.println(str);在这种情况下,它只使用两个反斜杠。为什么它不需要四个反斜杠,就像以前的情况一样?
发布于 2013-11-02 19:22:52
Java字符串是由字符组成的。为了允许java程序员将字符串作为‘常量’和Java代码的一部分输入,该语言允许您将字符串键入为被‘“引号包围的字符……
String str = "this is a string";有些字符很难输入到程序中,比如换行符或制表符。Java引入了转义机制,允许程序员将这些字符输入到字符串中。逃逸机制是“\”反斜杠。
String str = "this contains a tab\t and newline\n";问题是,现在没有一种简单的方法可以输入反斜杠,所以要输入反斜杠,就必须逃离它自己:
String str = "this contains a backslash \\"下一个问题是正则表达式是复杂的,它们还使用反斜杠\作为转义字符。
例如,在perl中,正则表达式\.将匹配确切的字符“.”因为在正则表达式中“.”是特殊的,需要用“\”来转义。要在Java程序中捕获序列\. (作为程序中的字符串常量),我们需要转义'\‘as \\,而我们的Java等效正则表达式是\\.。现在,在perl中,匹配实际反斜杠字符的正则表达式还是\\。类似地,我们需要在实际代码中转义这两者,这就是\\\\。
因此,这里的意义是窗口中的文件分隔符是反斜杠\.此单个字符存储在字段File.separator中。如果我们想从一个Java程序中键入相同的字符,我们必须将它转义为\\,但是'\‘已经存储在字段中,所以我们不需要为Java程序重新转义它,但是 do 需要为正则表达式转义它.
有两种方法可以为正则表达式转义它。您可以选择在反斜杠之前添加反斜杠:
"\\" + File.separator 但是这是一个不好的方法,因为它不能在Unix上工作(在Unix中,不需要转义分隔符。更糟糕的是,您所做的事情是将文件分隔符加倍:
File.separator+File.separator正确的方法是用Matcher.quoteReplacement(.)正确地转义正则表达式的替换侧。
System.out.println(Test.class.getName().replaceAll("\\.",
Matcher.quoteReplacement(File.separator)) + ".class ")发布于 2013-11-02 19:03:49
这四个反斜杠用于对该方法使用的两个反斜杠进行编码。"\\\\"被解释为:
"\\" (an escaped backslash)
"\\" (another escaped backslash)第1和第3反斜杠是为了逃避字符串中的第2和第4反斜杠。如果反斜杠存储在诸如File.separator这样的变量中,则不需要反斜杠。
要想得到更清晰的答案,请尝试下面的代码:
System.out.println("\\\\");它打印\\。
发布于 2013-11-02 19:04:17
因为File.separator是
public static final String separator = "" + separatorChar;
public static final char separatorChar = fs.getSeparator(); //gotten from system properties其中separatorChar是用于文件分离的特定于系统的char。在这种情况下你不需要逃避任何事情。
为什么它不需要四个反斜杠,就像以前的情况一样?
转义是用于文本的.
fs.getSeparator()所做的是(简单地说)
System.getProperty("file.separator");在Windows上返回String \。然后,getSeperator()获取该字符串的charAt(0),即char '\'。中的String与""连接时,将其转换为
public static final String separator = "" + separatorChar;这是在运行时完成的,因此不计算为String文本,因此不需要转义。
https://stackoverflow.com/questions/19745643
复制相似问题