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, '\\'));
答案 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可能无法修复它。修复会破坏向后兼容性。)