以下代码用完全限定类名中的反斜杠替换所有点(它可以是任何字符串)。
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);
在这种情况下,它只使用两个反斜杠。为什么它不像前一种情况那样需要四个反斜杠?
答案 0 :(得分:5)
Java字符串由字符组成。为了允许java程序员输入字符串作为“常量”和Java代码的一部分,该语言允许您将其键入为“''引号括起来的字符.....
String str = "this is a string";
某些字符很难输入程序,如换行符或制表符。 Java引入了一种转义机制,允许程序员将这些字符输入到String中。转义机制是'\'反斜杠。
String str = "this contains a tab\t and newline\n";
问题在于现在没有简单的方法来输入反斜杠,所以输入反斜杠必须自行解决:
String str = "this contains a backslash \\"
下一个问题是正则表达式是复杂的东西,它们也使用反斜杠\
作为转义字符。
现在,例如perl,正则表达式\.
将匹配确切的字符'。'因为在正则表达式中'。'很特别,需要用'\'进行转义。要在Java程序中捕获序列\.
(作为程序中的字符串常量),我们需要将'\'转义为\\
,并且我们的Java等效正则表达式为\\.
。现在,在perl中,与实际反斜杠字符匹配的正则表达式是\\
。同样,我们需要在实际代码中使用Java来解除这两个问题,它是\\\\
。
因此,这里的意义是windows中的文件分隔符是反斜杠\
。此单个字符存储在File.separator字段中。如果我们想要从Java程序中输入相同的字符,我们必须将它作为\\
转义,但是'\'已经存储在字段中,所以我们不需要重新转义它Java程序,但我们 DO 需要为正则表达式转义它....
有两种方法可以为正则表达式转义它。您可以选择在其前面添加反斜杠:
"\\" + File.separator
但这是一个糟糕的方法,因为它不适用于Unix(分隔符不需要转义。更糟糕的是做你所做的是将文件分隔符加倍:
File.separator+File.separator
正确的方法是使用Matcher.quoteReplacement(...)
正确地转义正则表达式的替换面System.out.println(Test.class.getName().replaceAll("\\.",
Matcher.quoteReplacement(File.separator)) + ".class ")
答案 1 :(得分:3)
四个反斜杠用于编码方法使用的两个反斜杠。 "\\\\"
被解释为:
"\\" (an escaped backslash)
"\\" (another escaped backslash)
第一个和第三个反斜杠用于转义字符串中的第二个和第四个反斜杠。如果反斜杠存储在File.separator
之类的变量中,则不需要它们。
要获得更清晰的答案,请尝试以下代码:
System.out.println("\\\\");
打印\\
。
答案 2 :(得分:2)
因为File.separator
是
public static final String separator = "" + separatorChar;
public static final char separatorChar = fs.getSeparator(); //gotten from system properties
其中separatorChar
是文件分隔的系统特定char
。在这种情况下,您不需要逃避任何事情。
为什么它不像前一种情况那样需要四个反斜杠?
转义适用于String
文字。
fs.getSeparator()
的作用(简单来说)
System.getProperty("file.separator");
在Windows上返回String
\
。然后getSeperator()
获取该字符串的charAt(0)
,即char '\'
。当与
String
连接时,会转换为""
public static final String separator = "" + separatorChar;
这是在运行时完成的,因此不会评估为String
字面值,因此不需要转义。
答案 3 :(得分:1)
您应该使用replace()
,因为它接收纯文本,而replaceAll()
采用正则表达式:
.replace(".", "\\");
关于文件分隔符,您可以使用/
,因为它可以在Java中的所有操作系统上运行。
答案 4 :(得分:1)
请注意,替换字符串中的反斜杠(\)和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同。如上所述,美元符号可被视为对捕获的子序列的引用,反斜杠用于替换替换字符串中的文字字符。
你需要引用替换的反斜杠,因此需要四个反斜杠。
您可以使用Pattern#quote使您的方法可移植。
正如@rolfl指出的那样,你必须使用Matcher#quoteReplacement来引用替换字符串。
System.out.println(Test.class.getName().replaceAll("\\.",
Matcher.quoteReplacement(File.separator)) + ".class ");