用Java中的反斜杠替换字符串中的所有点

时间:2013-11-02 18:59:44

标签: java string

以下代码用完全限定类名中的反斜杠替换所有点(它可以是任何字符串)。

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);

在这种情况下,它只使用两个反斜杠。为什么它不像前一种情况那样需要四个反斜杠?

5 个答案:

答案 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)

来自Matcher.#appendReplacement

的javadoc
  

请注意,替换字符串中的反斜杠(\)和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同。如上所述,美元符号可被视为对捕获的子序列的引用,反斜杠用于替换替换字符串中的文字字符。

你需要引用替换的反斜杠,因此需要四个反斜杠。

您可以使用Pattern#quote使您的方法可移植。

正如@rolfl指出的那样,你必须使用Matcher#quoteReplacement来引用替换字符串。

System.out.println(Test.class.getName().replaceAll("\\.",
    Matcher.quoteReplacement(File.separator)) + ".class ");