Java “全部替换”/&引用;使用File.separator
在Java中,当我这样做时: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
"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)
这样做而不是这样做有什么好处?