448

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

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

これが機能している間:

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

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

4

4 に答える 4

883

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

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ます。

于 2013-02-12T12:53:44.817 に答える
127

ドット「。」はJava正規表現エンジンの特殊文字であるため、「\\」を使用する必要があります。このキャラクターをエスケープするには:

final String extensionRemoved = filename.split("\\.")[0];
于 2013-02-12T12:56:08.347 に答える
35

これは、.が正規表現の予約文字であり、任意の文字を表すためです。代わりに、次のステートメントを使用する必要があります。

String extensionRemoved = filename.split("\\.")[0];
于 2013-02-12T12:54:01.633 に答える
20

私はあなたが点を逃れるべきだと信じています。試す:

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

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

于 2013-02-12T12:54:05.503 に答える