Java 文字列を「.」(ドット) で分割する [重複] 質問する

Java 文字列を「.」(ドット) で分割する [重複] 質問する

このコードの 2 行目がエラーをスローするのはなぜですかArrayIndexOutOfBoundsException?

String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split(".")[0];

これが機能している間:

String driveLetter = filename.split("/")[0];

私はJava 7を使用しています。

ベストアンサー1

リテラルドットで分割したい場合は、ドットをエスケープする必要があります。

String extensionRemoved = filename.split("\\.")[0];

それ以外の場合は、正規表現で分割され.、「任意の文字」を意味します。
正規表現で単一のバックスラッシュを作成するには、二重のバックスラッシュが必要であることに注意してください。


ArrayIndexOutOfBoundsException入力文字列が単なるドット、つまり であるため、が返されます。"."これは、ドットで分割すると空の配列が生成されるエッジケースです。split(regex)結果から末尾の空白をすべて削除しますが、ドットをドットで分割すると空白は 2 つしか残らないため、末尾の空白を削除すると空の配列が残ります。

このエッジケースでが発生しないようにするにはArrayIndexOutOfBoundsException、オーバーロードされたバージョンのsplit(regex, limit)には、結果の配列のサイズ制限を表す 2 番目のパラメータがあります。limit負の場合、結果の配列から末尾の空白を削除する動作は無効になります。

".".split("\\.", -1) // returns an array of two blanks, ie ["", ""]

つまり、filenameが単なるドットの場合"."、 を呼び出すとfilename.split("\\.", -1)[0]空白が返されますが、 を呼び出すとfilename.split("\\.")[0]がスローされますArrayIndexOutOfBoundsException

おすすめ記事