public static String getPortableFilePath(String target)
{
Pattern ptr=Pattern.compile("[\\|/]+");
Matcher mtr=ptr.matcher(target);
return mtr.replaceAll(File.separator);
}
public static void main(String[] args)
{
System.out.println(getPortableFilePath("C:///Program Files////Java\\jdk1.6.0_23/bin"));
}
在上面的代码中,我试图用当前系统File Separator替换所有的Forward和Backward斜杠。代码在放入类时编译很好,但是在执行时它会给出一个数组索引超出范围的异常。任何猜测为什么?
例外:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
at java.lang.String.charAt(Unknown Source)
at java.util.regex.Matcher.appendReplacement(Unknown Source)
at java.util.regex.Matcher.replaceAll(Unknown Source)
at Files.getPortableFilePath
at Files.main
答案 0 :(得分:3)
你的方法是(a)错误名称和(b)不必要。名称错误,因为它不返回可移植文件路径,它返回当前系统的路径;不必要的,因为如果您只是使用/到处Java将在所有平台上正常运行。在Java文件名中永远不需要使用反斜杠。
答案 1 :(得分:2)
你需要通过正则表达式引擎获得两个反斜杠。否则它会认为你正在逃避下一个角色。所以使用
"[\\\\/]+"
表示模式字符串。这样它就解析为模式
[\\/]+
这是使用反斜杠的字符串和正则表达式表示法的问题,并且没有办法跳过字符串插值阶段。
不要在方括号charclass中使用垂直管道:它是一个文字。
答案 2 :(得分:-1)
谢谢你的回答。终于找到了问题。
我替换了
Pattern ptr=Pattern.compile("[\\\\/]+");
与
Pattern ptr=Pattern.compile("[\\\\\\\\|/]+");
正如tchrist所指出的那样,这是必要的,但它仍然没有解决错误。
通过替换
修复了错误return mtr.replaceAll(File.separator);
与
对齐return mtr.replaceAll(File.separator+""+File.separator);
由于我在Windows环境中工作,File.separator
返回“\”,它本身作为转义字符并显示错误,这就是为什么原始代码在Jim Blackler的Mac上运行正常,因为{ {1}}对他来说不是“\”。
但是我对File.separator
异常仍然没有意义,这个异常必须在这里做什么。