it-swarm.com.de

Java Zeichenfolge geteilt durch "." (Punkt)

Warum wirft die zweite Zeile dieses Codes ArrayIndexOutOfBoundsException?

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

Während dies funktioniert:

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

Ich benutze Java 7.

330
Ali Ismayilov

Sie müssen den Punkt maskieren, wenn Sie einen Literalpunkt teilen möchten:

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

Andernfalls teilen Sie sich den regulären Ausdruck ., was "ein beliebiges Zeichen" bedeutet.
Beachten Sie den doppelten Backslash, der erforderlich ist, um einen einzelnen Backslash in der Regex zu erstellen.


Sie erhalten ein ArrayIndexOutOfBoundsException, weil Ihre Eingabezeichenfolge nur ein Punkt ist, dh ".", was ein Edge-Fall ist, der ein leeres Array erzeugt, wenn es auf einen Punkt aufgeteilt wird. split(regex) entfernt alle nachgestellten Leerzeichen aus dem Ergebnis, aber da beim Aufteilen eines Punkts auf einen Punkt nur zwei Leerzeichen verbleiben, bleibt nach dem Entfernen der nachgestellten Leerzeichen ein leeres Array übrig.

Verwenden Sie die überladene Version von split(regex, limit) , um zu vermeiden, dass für diesen Edge-Fall ArrayIndexOutOfBoundsException angezeigt wird. Dabei handelt es sich um einen zweiten Parameter, der die Größenbeschränkung für das resultierende Array darstellt. Wenn limit negativ ist , ist das Entfernen von nachgestellten Leerzeichen aus dem resultierenden Array deaktiviert:

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

wenn filename nur ein Punkt "." ist, gibt der Aufruf von filename.split("\\.", -1)[0] ein Leerzeichen zurück, der Aufruf von filename.split("\\.")[0] hingegen ein ArrayIndexOutOfBoundsException.

666
Bohemian

"." ist ein Sonderzeichen in der Regex-Engine Java, daher müssen Sie "\\" verwenden. um diesem Charakter zu entkommen:

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

Ich hoffe das hilft

91
aimhaj

Dies liegt daran, dass . ein reserviertes Zeichen im regulären Ausdruck ist, das ein beliebiges Zeichen darstellt. Stattdessen sollten wir die folgende Anweisung verwenden:

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

Ich glaube, du solltest dem Punkt entkommen. Versuchen:

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

Andernfalls wird Punkt als beliebiges Zeichen in regulären Ausdrücken interpretiert.

18