Heim >Java >javaLernprogramm >Warum behandelt String.split() in Java 8 leere Trennzeichen anders als frühere Versionen?

Warum behandelt String.split() in Java 8 leere Trennzeichen anders als frühere Versionen?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-12 20:26:16845Durchsuche

Why Does Java 8's String.split() Handle Empty Delimiters Differently Than Previous Versions?

Warum werden in Java 8 Split manchmal leere Zeichenfolgen am Anfang des Ergebnisarrays entfernt?

In Java 7 und früheren Versionen wird eine Zeichenfolge mit geteilt Ein leeres Trennzeichen („“) würde zu einem Array führen, das sowohl führende als auch nachfolgende leere Zeichenfolgen enthält. Dieses Verhalten hat sich in Java 8 geändert.

Verhalten von Java 8

In Java 8 enthält die Aufteilung an einem leeren Trennzeichen keine führende leere Zeichenfolge mehr im Ergebnisarray. Nachgestellte leere Zeichenfolgen werden jedoch weiterhin entfernt. Dies ist auf eine Änderung in der Implementierung von String.split und Pattern.split zurückzuführen.

Referenzimplementierung

Vergleich der Referenzimplementierungen von Pattern.split in Java 7 und Java 8, wir finden den folgenden Zusatz in Java 8:

if (index == 0 && index == m.start() && m.start() == m.end()) {
    // no empty leading substring included for zero-width match
    // at the beginning of the input char sequence.
    continue;
}

Dieser Code schließt Übereinstimmungen mit der Länge Null am Anfang der Eingabe aus Zeichenfolge aus dem Ergebnisarray.

Aufrechterhaltung der Kompatibilität

Einhaltung des Java 8-Verhaltens (Vorwärtskompatibilität)

Um ein konsistentes Verhalten sicherzustellen Ändern Sie in allen Java-Versionen Ihre regulären Ausdrücke wie folgt:

  1. Wenn die Regex kann mit Zeichenfolgen der Länge Null übereinstimmen, fügen Sie (?!A) am Ende hinzu und schließen Sie den ursprünglichen Regex in eine nicht einfangende Gruppe (?:...) ein.
  2. Wenn der Regex nicht mit Zeichenfolgen der Länge Null übereinstimmen kann Zeichenfolgen, es ist keine Änderung erforderlich.
  3. Wenn Sie unsicher sind, führen Sie beide Änderungen durch.

Befolgen Sie das Java 7-Verhalten (Abwärtskompatibilität)

Es gibt keine allgemeine Lösung für die Abwärtskompatibilität mit Java 7 oder früher. Möglicherweise sind benutzerdefinierte Implementierungen von Split erforderlich.

Das obige ist der detaillierte Inhalt vonWarum behandelt String.split() in Java 8 leere Trennzeichen anders als frühere Versionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn