web-dev-qa-db-ja.com

Java文字列が "。"で区切られている(ドット)

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

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

以下の作品の間:

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

私はJava 7を使っています。

308
Ali Ismayilov

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

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

それ以外の場合は、正規表現.に分割します。これは「任意の文字」を意味します。
正規表現内に単一のバックスラッシュを作成するために必要なダブルバックスラッシュに注意してください。


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

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

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

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

636
Bohemian

""はJavaの特殊文字なので、 "\\"を使用する必要があります。この文字をエスケープするには:

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

これが役立つことを願っています

84
aimhaj

これは.が正規表現の予約文字であり、任意の文字を表しているためです。代わりに、次の文を使用してください。

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

私はあなたがドットから逃げるべきだと思います。試してください:

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

それ以外の場合、ドットは正規表現の中の任意の文字として解釈されます。

17