我有一个完整的文件路径,我想获取文件名。
我使用以下说明:
String[] splittedFileName = fileName.split(System.getProperty("file.separator"));
String simpleFileName = splittedFileName[splittedFileName.length-1];
但是在Windows上它给出了:
java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
\
^
我可以避免这种例外吗?有更好的方法吗?
答案 0 :(得分:38)
问题是必须转义\
才能在正则表达式中将用作反斜杠。您应该使用splitting API which doesn't use regular expressions,或先使用Pattern.quote
:
// Alternative: use Pattern.quote(File.separator)
String pattern = Pattern.quote(System.getProperty("file.separator"));
String[] splittedFileName = fileName.split(pattern);
甚至更好,请使用File
API:
File file = new File(fileName);
String simpleFileName = file.getName();
答案 1 :(得分:5)
编写文件名时,应使用System.getProperty("file.separator")
。
当您读取文件名时,您可以使用正斜杠或反斜杠作为文件分隔符。
您可能需要尝试以下操作:
fileName = fileName.replace("\\", "/");
String[] splittedFileName = fileName.split("/"));
String simpleFileName = splittedFileName[splittedFileName.length-1];
答案 2 :(得分:2)
另一种更简单的方法是
File f = new File(path);
String fileName = f.getName();
我相信如果路径与平台兼容,这将有效,即不确定路径“c:\ file.txt”是否可以在Linux上运行。
答案 3 :(得分:0)
首先,对于这个特定问题,我建议使用java.util.File类而不是正则表达式。
话虽这么说,你遇到的问题的根源是反斜杠字符'\'表示Java正则表达式中的转义序列。正在发生的是正则表达式解析器看到反斜杠并期望在它之后有另一个字符来完成转义序列。解决这个问题的最简单方法是使用java.util.regex.Pattern.quote()方法,该方法将转义您提供的字符串中的任何特殊字符。
通过此更改,您的代码变为:
String splitRegex = Pattern.quote(System.getProperty("file.separator"));
String[] splittedFileName = fileName.split(splitRegex);
String simpleFileName = splittedFileName[splittedFileName.length-1];