在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);
}
}
请注意,我在sep
中使用文字字面量\\
而不是直接使用File.separator
,因为我的分隔符是UNIX分隔符 - 你应该可以直接使用:
s = s.replaceAll("/", Matcher.quoteReplacement(File.separator));
这将输出:
a\b\c\d
如预期所料。
Matcher.quoteReplacement(File.separator)
。 - Esailija试一试
String str = "a/b/c/d";
str = str.replace("/", File.separator);
replaceAll
将参数解析为正则表达式。 - FThompsonFile.separator
在Windows上是\
,也就是转义后的反斜杠。
但是,在替换字符串中,它代表着完全不同的含义。因此,你需要对它进行两次转义,一次是为了Java,另一次是为了替换字符串。
以下代码应该可以正常工作:
"a/b/c/d".replaceAll("/", Matcher.quoteReplacement(File.separator));
Pattern.quote
不起作用,结果将是aQ\EbQ\EcQ\Ed
。 - Esailijastr.replace('/', File.separatorChar)
。
a@b@c@d
和a/b/c/d
。 - XymostechFile.separator
对我来说是“/”!哦,当我把它改成“\”时,它就做到了你说的。 - Xymostech