转换为可移植文件路径

时间:2011-04-16 20:01:27

标签: java regex exception

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

3 个答案:

答案 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异常仍然没有意义,这个异常必须在这里做什么。