用File.separator替换所有的“/”

17

在Java中,当我执行:

    "a/b/c/d".replaceAll("/", "@");

我回来了

    a@b@c@d

但是当我这样做时:

    "a/b/c/d".replaceAll("/", File.separator);

它抛出了一个StringIndexOutOfBoundsException异常,但我不知道原因。我试图查找相关信息,但是没有太大帮助。有人可以帮帮我吗?


对我来说它运行良好。a@b@c@da/b/c/d - Xymostech
即使您尝试使用File.separator替换正斜杠,仍然会出现这种情况吗? - tomato
File.separator 对我来说是“/”!哦,当我把它改成“\”时,它就做到了你说的。 - Xymostech
2
只是为了好玩,您可以尝试使用原始字符串创建一个文件对象,然后打印出其路径。这可能不起作用,但我认为在Windows系统上它会将/转换为\。这种方法可能并不总是有效,但如果有效的话,似乎更加“正统”。例如,new File("c:/a/b/c").toPath()应该返回"c:\a\b\c"。我经常这样做,这样我就不必在Windows字符串中引用\。 - Bill K
严格来说,在Java中,您应该使用String#replace而不是String#replaceAll。两者都可以替换所有出现的内容,但后者应该与正则表达式一起使用。 - Marteng
4个回答

29

文档中已经有所说明:

请注意,替换字符串中的反斜杠(\)和美元符号($)可能会导致结果与将其视为文字替换字符串时不同;详见Matcher.replaceAll

而在Matcher.replaceAll中:

请注意,替换字符串中的反斜杠(\)和美元符号($)可能会导致结果与将其视为文字替换字符串时不同。如上所述,美元符号可能被视为对捕获子序列的引用,而反斜杠则用于转义替换字符串中的特殊字符。

你需要做的是转义任何在替换字符串中出现的转义字符,例如使用Matcher.quoteReplacement()方法:

import java.io.File;
import java.util.regex.Matcher;

class Test {
    public static void main(String[] args) {
        String s = "a/b/c/d";
        String sep = "\\"; // File.separator;
        s = s.replaceAll("/", Matcher.quoteReplacement(sep));
        System.out.println(s);
    }
}

请注意,我在sep中使用文字字面量\\而不是直接使用File.separator,因为我的分隔符是UNIX分隔符 - 你应该可以直接使用:

s = s.replaceAll("/", Matcher.quoteReplacement(File.separator));

这将输出:

a\b\c\d

如预期所料。


1
+1,他现在所需要的就是 Matcher.quoteReplacement(File.separator) - Esailija

10

试一试

    String str = "a/b/c/d";
    str = str.replace("/", File.separator);

2
谢谢,这个方法可行。不知道为什么replaceAll会抛出异常?我会尽快接受你的答案。 - tomato
我刚试过这个。在使用replaceAll方法时,我没有评估为什么会抛出异常。我会在闲暇时间里进行调查,并尝试找到正确的答案。 - Smit
@smit 参考 iccethedral 的回答来解释。replaceAll 将参数解析为正则表达式。 - FThompson
是的,iccthedral 给出的解释是正确的。replaceAll 方法将参数作为正则表达式传递,并且它会完全不同地处理该参数(特别是反斜杠“\”和美元符号“$”)。如果您查看 Java 文档,您将清楚地了解 replace 和 replaceAll 方法。 - Smit

9

File.separator在Windows上是\,也就是转义后的反斜杠。 但是,在替换字符串中,它代表着完全不同的含义。因此,你需要对它进行两次转义,一次是为了Java,另一次是为了替换字符串。

以下代码应该可以正常工作:

"a/b/c/d".replaceAll("/", Matcher.quoteReplacement(File.separator));

使用这种方法,在斜杠分隔符操作系统上会失败。然而,这个想法是正确的;你只需要正确地实现它。 - FThompson
它可以在Windows上运行,但对于其他操作系统来说不够通用。 - Greg
实际上,我的错,那段代码是无效的。我脑子一片空白,但这里需要一些与Pattern相关的转义方法。 - FThompson
Pattern.quote不起作用,结果将是aQ\EbQ\EcQ\Ed - Esailija
@Esailija 啊,我今天很累。你说得对。iccthedral只需删除代码,因为您的解释值得+1。 - FThompson
显示剩余2条评论

1
尝试使用 str.replace('/', File.separatorChar)

这样做的好处是什么,与 https://dev59.com/-2Yr5IYBdhLWcg3wYpQg#13714791 不同? - MasterJoe

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