如何用java String中的replaceAll“/”来格式化URL?

时间:2013-03-11 02:57:40

标签: java regex

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, '\\'));

2 个答案:

答案 0 :(得分:3)

尝试:

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

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

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

答案 1 :(得分:3)

您的平台是Windows吗?那么File.separator会反对吗?

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

javadoc说:

  

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

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

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