用File.separator替换所有"/"

dev*_*jay 13 java regex separator

在Java中,当我这样做时:

    "a/b/c/d".replaceAll("/", "@");
Run Code Online (Sandbox Code Playgroud)

我回来了

    a@b@c@d
Run Code Online (Sandbox Code Playgroud)

但当我这样做时:

    "a/b/c/d".replaceAll("/", File.separator);
Run Code Online (Sandbox Code Playgroud)

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

pax*_*blo 24

它在文档中说它就在那里:

请注意,替换字符串中的反斜杠(\)和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同; 看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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

s = s.replaceAll("/", Matcher.quoteReplacement(File.separator));
Run Code Online (Sandbox Code Playgroud)

这输出:

a\b\c\d
Run Code Online (Sandbox Code Playgroud)

正如所料.


nul*_*ent 9

File.separator\在Windows上,那就是; 这是一个逃脱的反斜杠.但是,在替换字符串中,它意味着完全不同的东西.所以你必须逃避它两次,一次用于Java,一次用于替换字符串.

这应该工作:

"a/b/c/d".replaceAll("/", Matcher.quoteReplacement(File.separator));
Run Code Online (Sandbox Code Playgroud)


Smi*_*mit 8

试试这个

    String str = "a/b/c/d";
    str = str.replace("/", File.separator);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这有效。我想知道为什么 replaceAll 会抛出异常?我会尽快接受你的回答。 (2认同)