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

別のより簡単な方法は、

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

パスがプラットフォームと互換性がある場合、これは機能すると思います。つまり、パス「c:\file.txt」が Linux で機能するかどうかはわかりません。

于 2012-04-26T15:26:28.263 に答える
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 に答える