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("(\\.).*", "");
所以你得到前缀=这个;