在 Java 中,当我这样做时:
"a/b/c/d".replaceAll("/", "@");
我回来
a@b@c@d
但是当我这样做时:
"a/b/c/d".replaceAll("/", File.separator);
它抛出一个 StringIndexOutOfBoundsException,我不知道为什么。我试着查了一下,但它不是很有帮助。谁能帮我吗?
它在文档中说:
请注意,替换字符串中的反斜杠 (\) 和美元符号 ($) 可能会导致结果与将其视为文字替换字符串时的结果不同;见
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
正如预期的那样。
试试这个
String str = "a/b/c/d";
str = str.replace("/", File.separator);
File.separator
在\
Windows 上,即;它是一个转义的反斜杠。但是,在替换字符串中,它意味着完全不同的东西。所以你必须对它进行两次转义,一次用于 Java,一次用于替换字符串。
这应该有效:
"a/b/c/d".replaceAll("/", Matcher.quoteReplacement(File.separator));
尝试str.replace('/', File.separatorChar)