String的replaceAll()方法和转义字符

这条线

System.out.println("\\"); 

打印单个反斜杠( \ )。 和

 System.out.println("\\\\"); 

打印双反斜杠( \\ )。 明白!

但为什么在以下代码中:

 class ReplaceTest { public static void main(String[] args) { String s = "hello.world"; s = s.replaceAll("\\.", "\\\\"); System.out.println(s); } } 

是输出:

 hello\world 

代替

 hello\\world 

毕竟, replaceAll()方法正在用( \\\\ )替换一个点( \\. )。

有人可以解释一下吗?

使用正则表达式替换字符时,您可以使用反向引用,例如\1来替换使用匹配中的分组。

但是,这意味着反斜杠是一个特殊字符,因此如果您确实想要使用反斜杠,则需要对其进行转义。

这意味着在Java字符串中使用它时需要实际转义两次。 (首先是字符串解析器,然后是正则表达式解析器。)

replaceAll的javadoc说:

请注意,替换字符串中的反斜杠(\)和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同; 见Matcher.replaceAll。 如果需要, 使用Matcher.quoteReplacement(java.lang.String)来抑制这些字符的特殊含义。

如果您不需要正则表达式进行替换,只需要替换确切的字符串,请在替换之前转义正则表达式控制字符

 String trickyString = "$Ha!I'm tricky|.|"; String safeToUseInReplaceAllString = Pattern.quote(trickyString); 

这是我评论的格式化附录

 s = s.replaceAll("\\.", Matcher.quoteReplacement("\\")); 

更具有可读性和意义

 s = s.replaceAll("\\.", "\\\\\\"); 

反斜杠是Java Strings中的转义字符。 例如,反斜杠在Java中具有预定义。 您必须使用“\ \”来定义单个反斜杠。 如果要定义“\ w”,则必须在正则表达式中使用“\ \ w”。 如果你想使用反斜杠作为文字,你必须输入\ \ \ \,因为\也是正则表达式中的转义字符。

我相信在这种特殊情况下,更容易使用替换而不是替换所有。 Gonzo牧师在谈到逃避这个角色时有正确的答案。

使用replaceAll:

 s = s.replaceAll("\\.", "\\\\\\\\"); 

使用替换:

 s = s.replaceAll(".", "\\"); 

replace只需要一个字符串来匹配,而不是一个正则表达式。

我不喜欢这种正则表达式的实现。 我们应该能够使用单个’\’转义字符,而不是’\’。 但无论如何,如果你想得到THIS.Out_Of_That你可以做到:

 String prefix = role.replaceFirst("(\\.).*", ""); 

所以你得到前缀=这个;