476 Stimmen

Java Zeichenfolge mit "." (Punkt) aufteilen

Warum wirft die zweite Zeile dieses Codes ArrayIndexOutOfBoundsException?

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

Während dies funktioniert:

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

Ich verwende Java 7.

944voto

Bohemian Punkte 386825

Sie müssen den Punkt escapen, wenn Sie auf einen literalen Punkt aufteilen möchten:

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

Andernfalls teilen Sie nach dem Regex ., was "beliebiges Zeichen" bedeutet.
Beachten Sie den doppelten Backslash, der benötigt wird, um einen einzelnen Backslash im Regex zu erzeugen.


Sie erhalten eine ArrayIndexOutOfBoundsException, weil Ihr Eingabestring nur ein Punkt ist, d.h. ".", was einen Sonderfall darstellt, der ein leeres Array produziert, wenn auf Punkt aufgeteilt wird; split(regex) entfernt alle führenden Leerzeichen vom Ergebnis, aber da beim Aufteilen eines Punkts auf einen Punkt nur zwei Leerzeichen bleiben, werden nach Entfernen der führenden Leerzeichen ein leeres Array übrig bleiben.

Um eine ArrayIndexOutOfBoundsException für diesen Sonderfall zu vermeiden, verwenden Sie die überladene Version von split(regex, limit), die ein zweiter Parameter ist, der die Größenbegrenzung für das resultierende Array ist. Wenn limit negativ ist, wird das Entfernen von führenden Leerzeichen aus dem resultierenden Array deaktiviert:

".".split("\\.", -1) // gibt ein Array von zwei Leerzeichen zurück, d.h. ["", ""]

d.h., wenn filename nur ein Punkt "." ist, wird filename.split("\\.", -1)[0] ein Leerzeichen zurückgeben, aber filename.split("\\.")[0] eine ArrayIndexOutOfBoundsException werfen.

138voto

aimhaj Punkte 1505

Der Punkt "." ist ein Sonderzeichen im Java Regex-Motor, daher müssen Sie "\\." verwenden, um dieses Zeichen zu escapen:

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

35voto

Gabriele Mariotti Punkte 248840

Dies liegt daran, dass . ein reserviertes Zeichen in regulären Ausdrücken ist, das jedes Zeichen darstellt. Stattdessen sollten wir die folgende Anweisung verwenden:

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

21voto

Ivaylo Strandjev Punkte 67241

Ich glaube, du solltest den Punkt escapen. Versuche es so:

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

Ansonsten wird der Punkt als jedes Zeichen in regulären Ausdrücken interpretiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X