17

在 Java 中,当我这样做时:

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

我回来

    a@b@c@d

但是当我这样做时:

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

它抛出一个 StringIndexOutOfBoundsException,我不知道为什么。我试着查了一下,但它不是很有帮助。谁能帮我吗?

4

4 回答 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);
    }
}

请注意,我使用的是文字\\insep而不是File.separator直接使用,因为我的分隔符是 UNIX 分隔符 - 你应该能够只使用:

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

这输出:

a\b\c\d

正如预期的那样。

于 2012-12-05T01:23:41.753 回答
10

试试这个

    String str = "a/b/c/d";
    str = str.replace("/", File.separator);
于 2012-12-05T01:12:04.670 回答
9

File.separator\Windows 上,即;它是一个转义的反斜杠。但是,在替换字符串中,它意味着完全不同的东西。所以你必须对它进行两次转义,一次用于 Java,一次用于替换字符串。

这应该有效:

"a/b/c/d".replaceAll("/", Matcher.quoteReplacement(File.separator));
于 2012-12-05T01:13:32.687 回答
1

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

于 2014-01-14T08:26:48.687 回答