该行
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()
方法正在用(\\.
)替换点(\\\\
)。
有人可以解释一下吗?
答案 0 :(得分:23)
使用正则表达式替换字符时,您可以使用反向引用(例如\1
)来替换匹配中的分组。
然而,这意味着反斜杠是一个特殊字符,所以如果你真的想要使用反斜杠,则需要对其进行转义。
这意味着在Java字符串中使用它时需要实际转义两次。 (首先是字符串解析器,然后是正则表达式解析器。)
答案 1 :(得分:14)
replaceAll的javadoc说:
请注意替换中的反斜杠(\)和美元符号($) 字符串可能会导致结果与正确的结果不同 被视为字面替换字符串;见Matcher.replaceAll。 使用 Matcher.quoteReplacement(java.lang.String)来压制特殊 如果需要,这些字符的含义。
答案 2 :(得分:5)
如果您不需要正则表达式进行替换,只需要替换完整的字符串,请在替换之前转义正则表达式控制字符
String trickyString = "$Ha!I'm tricky|.|";
String safeToUseInReplaceAllString = Pattern.quote(trickyString);
答案 3 :(得分:3)
这是我的评论的格式化附录
s = s.replaceAll("\\.", Matcher.quoteReplacement("\\"));
更具有可读性和意义
s = s.replaceAll("\\.", "\\\\\\");
答案 4 :(得分:0)
反斜杠是Java Strings中的转义字符。例如反斜杠在Java中具有预定义。您必须使用“\ \”来定义单个反斜杠。如果要定义“\ w”,则必须在正则表达式中使用“\ \ w”。如果你想使用反斜杠作为文字,你必须输入\ \ \ \,因为\也是正则表达式中的转义字符。
答案 5 :(得分:0)
我相信在这种特殊情况下,更容易使用替换而不是替换所有。 Gonzo牧师在谈到逃避角色时有正确的答案。
使用replaceAll:
s = s.replaceAll("\\.", "\\\\\\\\");
使用替换:
s = s.replaceAll(".", "\\");
replace只需要一个匹配的字符串,而不是一个正则表达式。
答案 6 :(得分:0)
我不喜欢这种正则表达式的实现。我们应该能够使用单个'\'而不是'\'来转义字符。但是无论如何,如果您想获得THIS.Out_Of_That可以这样做:
$nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Wed_Apr_11_23:16:29_CDT_2018
Cuda compilation tools, release 9.2, V9.2.88
所以您得到前缀= THIS;