在Java中,一个简单的场景需要用四个反斜杠来替换一个字符为反斜杠。

3

让我们考虑以下Java代码片段。

package escape;

final public class Main
{
    public static void main(String[] args)
    {            
         String s = "abc/xyz";
         System.out.println(s.replaceAll("/", "\\\\"));
    }
}

我只想在上面的字符串abc/xyz中将“/”替换为“\”,已经完成并显示了预期的abc\xyz,但我不明白为什么需要四个反斜杠。看起来两个反斜杠就足够了,为什么不是这种情况?

4个回答

8
原因是String.replaceAll使用正则表达式(实际上调用Matcher.replaceAll来执行替换),在正则表达式中,必须转义“\”,而在字符串字面量中,也必须转义“\”,你的4个反斜杠在Java字符串中只有2个斜杠,并且在正则表达式中表示转义斜杠。

5
您需要为Java String转义一次反斜杠\\,并且在regex替换字符串中再次转义一次\\
JavaDoc中可以看到:
请注意,在replacement字符串中,反斜杠(\)和美元符号($)可能导致结果与其作为字面替换字符串处理时不同;参见Matcher.replaceAll。如果需要,使用Matcher.quoteReplacement(java.lang.String)来抑制这些字符的特殊含义。
    System.out.println(s.replaceAll("/", Matcher.quoteReplacement("\\"))); 

4

我想把“/”替换成“\”

那么你不应该使用正则表达式,这太过复杂,还需要对反斜杠进行两次转义。相反,你可以使用以下代码:

string.replace('/', '\\');

仍然需要对它进行一次转义


2
参考Java文档,如果使用replaceAll,Java将把第一个参数视为正则表达式,并在替换字符串中评估反斜杠的特殊含义。基本上,\1将引用正则表达式中的第一个匹配项... 在这种情况下,您需要转义反斜杠,使它们成为字符串中的“字面”反斜杠,然后再次转义这些内容,以便replaceAll不会尝试对其进行特殊处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接