Start · Sprachen · JavaScript · Referenz · RegExp.prototype[Symbol.split]()

RegExp.prototype[Symbol.split]()

Methode

Teilt einen String an den Treffern des regulären Ausdrucks und gibt ein Array der Teilstrings zurück. Wird intern von <code>String.prototype.split()</code> aufgerufen.

seit JavaScript ES2015 Kategorie: method-property

Signatur

RegExp.prototype[Symbol.split](str, limit)

Beschreibung

Die Methode [Symbol.split]() ist ein sogenanntes well-known symbol-Protokoll: Wenn Sie str.split(regex) aufrufen, prüft String.prototype.split(), ob das Trennzeichen eine Methode unter Symbol.split besitzt, und ruft dann regex[Symbol.split](str, limit) auf. Die eigentliche Logik zum Teilen eines Strings mit einem regulären Ausdruck steckt also in dieser Methode.

Intern erzeugt die Methode über den Symbol.species-Konstruktor eine Kopie des regulären Ausdrucks, an deren Flags y (sticky) angehängt wird. Anschließend wird der String Position für Position durchsucht. Das originale Objekt und dessen lastIndex bleiben dabei unverändert. Enthält der Ausdruck Capture-Gruppen, werden deren Inhalte zwischen den Teilstrings mit ins Ergebnis-Array übernommen – eine praktische Möglichkeit, die Trennzeichen zu behalten.

Direkt aufrufen müssen Sie die Methode selten. Nützlich ist sie vor allem, wenn Sie eine Unterklasse von RegExp schreiben und das Verhalten von split() anpassen wollen – etwa, um Ergebnisse nachzubearbeiten, leere Einträge zu filtern oder zu protokollieren.

Parameter

Name Typ Default Beschreibung
$str Pflicht string Der zu teilende String. Andere Werte werden per String() in einen String umgewandelt.
$limit number 2<sup>32</sup> − 1 Maximale Anzahl an Einträgen im Ergebnis-Array. Wird per ToUint32 umgewandelt; bei 0 ergibt sich sofort ein leeres Array. Der Rest des Strings wird verworfen, nicht an das letzte Element angehängt.

Rückgabewert

Typ
string[]
Beschreibung
Ein neues Array mit den Teilstrings. Inhalte von Capture-Gruppen werden zwischen den Teilstrings eingefügt; nicht beteiligte Gruppen erscheinen als undefined.

Beispiele

Indirekter Aufruf über String.prototype.split

const csvZeile = 'Apfel;Birne, Kirsche;Pflaume';
// Trennt an Semikolon oder Komma mit optionalem Leerzeichen
const obst = csvZeile.split(/[;,]\s*/);
console.log(obst);
[ 'Apfel', 'Birne', 'Kirsche', 'Pflaume' ]

Direkter Aufruf mit limit

const re = /-/;
console.log(re[Symbol.split]('2024-05-17'));
console.log(re[Symbol.split]('2024-05-17', 2));
[ '2024', '05', '17' ] [ '2024', '05' ]

Trennzeichen per Capture-Gruppe behalten

const ausdruck = '12+7-3*4';
// Die Klammern sorgen dafür, dass die Operatoren im Ergebnis bleiben
const tokens = ausdruck.split(/([+\-*/])/);
console.log(tokens);
[ '12', '+', '7', '-', '3', '*', '4' ]

Verhalten in einer RegExp-Unterklasse überschreiben

class TrimSplitRegExp extends RegExp {
  [Symbol.split](str, limit) {
    // Standardverhalten nutzen, dann nachbearbeiten
    const teile = super[Symbol.split](str, limit);
    return teile.map((t) => t.trim()).filter((t) => t !== '');
  }
}

const tags = ' js ,, web ,api , '.split(new TrimSplitRegExp(','));
console.log(tags);
[ 'js', 'web', 'api' ]

// Wichtig · Fallstricke

  • Flag g ist bedeutungslos: Die Methode arbeitet intern immer mit einer Sticky-Kopie (y). lastIndex des Originals wird weder gelesen noch verändert.
  • Nicht beteiligte Capture-Gruppen landen als undefined im Array: 'ab'.split(/(x)?b/) ergibt ['a', undefined, '']. Verwenden Sie nicht erfassende Gruppen (?:…), wenn Sie die Trennzeichen nicht brauchen.
  • Leerer String als Eingabe: Passt der Ausdruck auf den leeren String, ist das Ergebnis [], sonst [''].
  • Unicode: Ohne Flag u/v teilt /(?:)/ nach UTF-16-Code-Units, was Emojis in Surrogat-Hälften zerlegt. Mit u wird nach Codepoints geteilt: '😀'.split(/(?:)/u) → ['😀'].
  • Performance: Durch die Kopie über Symbol.species und das schrittweise Sticky-Matching ist Teilen mit RegExp deutlich langsamer als mit einem einfachen String-Trennzeichen. Nutzen Sie bei festen Trennzeichen besser str.split(',').
  • Unterstützt von allen modernen Browsern und Node.js 6+; der Internet Explorer kennt es nicht.