以下代码用完全限定类名中的反斜杠替换所有点(它可以是任何字符串).
String str=Test.class.getName().replaceAll("\\.", "\\\\") + ".class";
System.out.println(str);
Run Code Online (Sandbox Code Playgroud)
替换字符串需要四个反斜杠.
假设替换字符串是文件路径中的分隔符,我想在不同的操作系统上使用它java.io.File.separator.
String separator=File.separator+File.separator
String str=Test.class.getName().replaceAll("\\.", separator) + ".class "
System.out.println(str);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它只使用两个反斜杠.为什么它不像前一种情况那样需要四个反斜杠?
Java字符串由字符组成.为了允许java程序员输入字符串作为"常量"和Java代码的一部分,该语言允许您将它们键入为"''引号括起来的字符.....
String str = "this is a string";
Run Code Online (Sandbox Code Playgroud)
某些字符很难输入到程序中,如换行符或制表符.Java引入了一种转义机制,允许程序员将这些字符输入到String中.转义机制是'\'反斜杠.
String str = "this contains a tab\t and newline\n";
Run Code Online (Sandbox Code Playgroud)
问题是现在没有简单的方法来输入反斜杠,所以输入反斜杠必须自行解决:
String str = "this contains a backslash \\"
Run Code Online (Sandbox Code Playgroud)
下一个问题是正则表达式是复杂的东西,它们也使用反斜杠\作为转义字符.
现在,例如,perl,正则表达式\.将匹配确切的字符'.' 因为在正则表达式中'.' 很特别,需要用'\'进行转义.要\.在Java程序中捕获该序列(作为程序中的字符串常量),我们需要将'\'转义为\\和我们的Java等效正则表达式一样\\..现在,在perl中,再次使用与实际反斜杠字符匹配的正则表达式\\.同样,我们需要在实际代码中用Java来逃避这两个问题\\\\.
所以,这里的意义是windows中的文件分隔符是反斜杠\.此单个字符存储在File.separator字段中.如果我们想从Java程序中输入相同的字符,我们必须将其转义为\\,但是'\'已经存储在字段中,因此我们不需要为Java程序重新转义它,但是我们千万要逃避它的正则表达式....
有两种方法可以为正则表达式转义它.您可以选择在它之前添加反斜杠:
"\\" + File.separator
Run Code Online (Sandbox Code Playgroud)
但这是一个不好的方法,因为它不能在Unix上工作(分隔符不需要转义.更糟糕的是做你所做的是将文件分隔符加倍:
File.separator+File.separator
Run Code Online (Sandbox Code Playgroud)
正确的方法是使用Matcher.quoteReplacement(...)正确地转义正则表达式的替换面
System.out.println(Test.class.getName().replaceAll("\\.",
Matcher.quoteReplacement(File.separator)) + ".class ")
Run Code Online (Sandbox Code Playgroud)