1
String url = "d://test////hello\\\hello";
String separator = File.separator;
url = url.replaceAll("\\*", separator);
url = url.replaceAll("/+", separator);

我想格式化那些url,但是当我尝试使用时发生错误replaceAll("/+", separator)。我试图逃脱"/""\\/"它仍然不起作用..

这是来自控制台的异常:

Exception in thread "main" **java.lang.StringIndexOutOfBoundsException**: String index out of range: 1
    at java.lang.String.charAt(String.java:686)
    at java.util.regex.Matcher.appendReplacement(Matcher.java:703)
    at java.util.regex.Matcher.replaceAll(Matcher.java:813)
    at java.lang.String.replaceAll(String.java:2189)

现在它可以工作了

 String separator = null;
 if(File.separator.equals("/")) {
    separator = "/";
    url = url.replaceAll("/+", separator);
    url = url.replaceAll("\\\\+", separator);
 } else {
    separator = Matcher.quoteReplacement(File.separator);
    url = url.replaceAll("/+", separator);
    url = url.replaceAll("\\+", separator);
 }

:) 它适用于 javascript

var i = "d:\\ad////df";
alert(i.replace(/\/+/g, '\\'));
4

2 回答 2

3

尝试:

url = url.replaceAll("\\\\+", separator);

您需要 4 个反斜杠。Java 字符串转义一次,正则表达式元字符转义一次。那就是对于正则表达式,您需要两个反斜杠\\,而在字符串中,您需要用另外两个来转义它们。

此外,量词*表示零或更多,您需要使用+.

于 2013-03-11T03:03:32.287 回答
3

你的平台是Windows吧?所以File.separator会是反斜杠吗?

解释是第二个参数String.replaceAll不是一个简单的字符串。相反,它是一种替代模式......

javadoc说:

“请注意,替换字符串中的反斜杠 (\) 和美元符号 ($) 可能会导致结果与将其视为文字替换字符串时的结果不同;请参阅 Matcher.replaceAll。使用 Matcher.quoteReplacement(java.lang. String) 来抑制这些字符的特殊含义,如果需要的话。”

因此,由单个反斜杠组成的替换字符串是无效的文字替换字符串。您需要引用分隔符 String ... 就像 javadoc 说的那样。

(你得到那个特殊的例外有点令人惊讶。我可以想象它是如何发生的,但我原以为他们会更优雅地处理糟糕的转义。请注意,如果这被报告为“错误” , Oracle 可能不会修复它。修复会破坏向后兼容性。)

于 2013-03-11T03:11:36.727 回答