Signatur
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
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);
Direkter Aufruf mit limit
const re = /-/;
console.log(re[Symbol.split]('2024-05-17'));
console.log(re[Symbol.split]('2024-05-17', 2));
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);
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);
// Wichtig · Fallstricke
- Flag
gist bedeutungslos: Die Methode arbeitet intern immer mit einer Sticky-Kopie (y).lastIndexdes Originals wird weder gelesen noch verändert. - Nicht beteiligte Capture-Gruppen landen als
undefinedim 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/vteilt/(?:)/nach UTF-16-Code-Units, was Emojis in Surrogat-Hälften zerlegt. Mituwird nach Codepoints geteilt:'😀'.split(/(?:)/u)→['😀']. - Performance: Durch die Kopie über
Symbol.speciesund das schrittweise Sticky-Matching ist Teilen mit RegExp deutlich langsamer als mit einem einfachen String-Trennzeichen. Nutzen Sie bei festen Trennzeichen besserstr.split(','). - Unterstützt von allen modernen Browsern und Node.js 6+; der Internet Explorer kennt es nicht.