24

我有一个完整的文件路径,我想获取文件名。

我正在使用以下说明:

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
\
 ^

我可以避免这个例外吗?有一个更好的方法吗?

4

4 回答 4

49

问题是\必须对其进行转义才能在正则表达式中将其用作反斜杠。您应该使用使用正则表达式的拆分 API,或者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();
于 2012-04-26T15:15:21.067 回答
8

当你写一个文件名时,你应该使用System.getProperty("file.separator").

当您读取文件名时,您可能会使用正斜杠或反斜杠作为文件分隔符。

您可能想尝试以下方法:

fileName = fileName.replace("\\", "/");
String[] splittedFileName = fileName.split("/"));
String simpleFileName = splittedFileName[splittedFileName.length-1];
于 2012-04-26T15:18:30.887 回答
2

首先,对于这个特定问题,我建议使用 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];
于 2012-04-26T15:20:31.387 回答
2

另一种更简单的方法可能是

File f = new File(path);
String fileName = f.getName();

我相信只要路径与平台兼容,这将起作用,即不确定路径“c:\file.txt”是否可以在 Linux 上运行。

于 2012-04-26T15:26:28.263 回答