Java “全部替换”/&引用;使用File.separator

Java “全部替换”/&引用;使用File.separator,java,regex,separator,Java,Regex,Separator,在Java中,当我这样做时: "a/b/c/d".replaceAll("/", "@"); "a/b/c/d".replaceAll("/", File.separator); 我回来了 a@b@c@d 但当我这样做的时候: "a/b/c/d".replaceAll("/", "@"); "a/b/c/d".replaceAll("/", File.separator); 它抛出了一个StringIndexOutOfBoundsExceptio

在Java中,当我这样做时:

    "a/b/c/d".replaceAll("/", "@");
    "a/b/c/d".replaceAll("/", File.separator);
我回来了

    a@b@c@d
但当我这样做的时候:

    "a/b/c/d".replaceAll("/", "@");
    "a/b/c/d".replaceAll("/", File.separator);
它抛出了一个StringIndexOutOfBoundsException,我不知道为什么。我试着查这个,但没什么帮助。有人能帮我吗?

试试这个

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

File.separator
在Windows上是
\
,也就是说;这是一个转义反斜杠。 然而,在替换字符串中,它意味着一些东西。所以您必须两次转义它,一次用于Java,一次用于替换字符串

这应该起作用:

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

上面写着,就在那里:

请注意,替换字符串中的反斜杠(\)和美元符号($)可能会导致结果不同于将其视为文字替换字符串时的结果;请参见
Matcher.replaceAll

并且,在
Matcher.replaceAll
中:

请注意,替换字符串中的反斜杠(\)和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同。如上所述,美元符号可被视为对捕获子序列的引用,反斜杠用于转义替换字符串中的文字字符。

您需要做的是转义替换字符串中的任何转义字符,例如:

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

s = s.replaceAll("/", Matcher.quoteReplacement(File.separator));
这将产生:

a\b\c\d

正如所料。

尝试使用
str.replace('/',File.separatorChar)
它对我来说运行良好<代码>a@b@c@d和
a/b/c/d
。即使您试图用文件替换正斜杠。分隔符?
File.separator
对我来说是“/”!哦,当我把它改成“\\”时,它会按照你说的做。只是为了好玩,你可以试着用字符串原样创建一个文件对象,然后打印出它的路径。这可能不起作用,但我认为在Windows系统上,它可以为您转换/到\中。可能并不总是有效的,但如果真的有效,这似乎是一种更“合法”的方法。例如,新文件(“c:/a/b/c”).toPath()应返回“c:\a\b\c”。我一直这样做,所以我不必在windows字符串中引用\。严格地说,在Java中,应该使用字符串#replace而不是字符串#replaceAll。这两种方法都会替换所有出现的情况,但后者应该与正则表达式一起使用。使用这种方法,它将在正向斜杠分隔符操作系统上失败。然而,这个想法是正确的;你只需要正确地实现它。@Vulcan,没错。我只是想简单地解释一下为什么会发生这种情况。它适用于Windows,但对其他OSS来说不够通用。事实上,我的错,那代码是无效的。我是空白,但是这里有一些与模式转义相关的方法,这是必要的。
Pattern.quote
但是这也不起作用,结果将是
aQ\EbQ\EcQ\Ed
谢谢,这很有效。我想知道为什么replaceAll抛出异常?我会尽快接受你的回答。我刚试过这个。我没有评估为什么在使用replaceAll方法时它会引发异常。我将在空闲时间调查并试图找到正确的答案。@smit请参考ICCETHERDAL的答案进行解释
replaceAll
将参数解析为regex。是的,iccthedral给出的解释是正确的。replaceAll方法将参数作为regex传递,并将该参数视为完全不同的参数(特别是反斜杠“\”和美元符号“$”)。如果您查看java文档,您将清楚地了解replace和replaceAll方法。+1,他现在只需要
Matcher.quoteReplacement(File.separator)
这样做而不是这样做有什么好处?