用File.separator替换所有“/”

时间:2012-12-05 01:04:59

标签: java regex separator

在Java中,当我这样做时:

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

我回来了

    a@b@c@d

但是当我这样做时:

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

它抛出一个StringIndexOutOfBoundsException,我不知道为什么。我试着看一下,但这不是很有帮助。任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:22)

它在documentation

中就是这么说的
  

请注意,替换字符串中的反斜杠(\)和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同;见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 :(得分:9)

Windows上的

File.separator\,即;这是一个逃脱的反斜杠。 但是,在替换字符串中,它表示completely different。所以你必须逃避它两次,一次用于Java,一次用于替换字符串。

这应该有效:

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

答案 2 :(得分:8)

试试这个

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

答案 3 :(得分:1)

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