以下代码将完全限定类名(可以是任何字符串)中的所有点替换为反斜杠。
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);
在这种情况下,它只使用两个反斜杠。为什么不像前面的例子那样需要四个反斜杠?
最佳答案
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 程序转义它,但我们确实需要为正则表达式转义它....
正则表达式有两种转义方式。您可以选择在它之前添加一个反斜杠:
"\\" + File.separator
但这是一个糟糕的方法,因为它不会在 Unix 上工作(分隔符不需要转义。做你所做的事情更糟糕,即加倍文件分隔符:
File.separator+File.separator
正确的做法是用Matcher.quoteReplacement(...) 正确地转义正则表达式的替换端。
System.out.println(Test.class.getName().replaceAll("\\.",
Matcher.quoteReplacement(File.separator)) + ".class ")
关于java - 用Java中的反斜杠替换字符串中的所有点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19745643/