RegExp.prototype[Symbol.split]()
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Januar 2020 browserübergreifend verfügbar.
Die Methode [Symbol.split]() von RegExp-Instanzen legt fest, wie sich String.prototype.split verhält, wenn ein regulärer Ausdruck als Trennzeichen übergeben wird.
Probieren Sie es aus
class RegExp1 extends RegExp {
[Symbol.split](str, limit) {
const result = RegExp.prototype[Symbol.split].call(this, str, limit);
return result.map((x) => `(${x})`);
}
}
console.log("2016-01-02".split(new RegExp1("-")));
// Expected output: Array ["(2016)", "(01)", "(02)"]
console.log("2016-01-02".split(/-/));
// Expected output: Array ["2016", "01", "02"]
Syntax
regexp[Symbol.split](str)
regexp[Symbol.split](str, limit)
Parameter
str-
Die Zeichenfolge, die aufgeteilt werden soll.
limitOptional-
Eine Ganzzahl, die die maximale Anzahl der zurückgegebenen Teile angibt. Die Methode
[Symbol.split]()teilt die Zeichenfolge weiterhin bei jedem Treffer desthis-RegExp-Musters (oder, in der obigen Syntax, vonregexp), bis die Anzahl der Teilelimiterreicht oder das Muster im verbleibenden Teil der Zeichenfolge nicht mehr vorkommt.
Rückgabewert
Ein Array mit Teilzeichenfolgen als Elementen. Capturing Groups sind ebenfalls enthalten.
Beschreibung
Mit dieser Methode lässt sich das Verhalten von split() in RegExp-Unterklassen anpassen. Sie wird intern von String.prototype.split() aufgerufen, wenn ein RegExp als Trennzeichen übergeben wird. Die folgenden beiden Beispiele liefern dasselbe Ergebnis.
"a-b-c".split(/-/);
/-/[Symbol.split]("a-b-c");
Wie [Symbol.matchAll]() verwendet [Symbol.split]() zunächst [Symbol.species], um einen neuen regulären Ausdruck zu erstellen. Dadurch wird vermieden, den ursprünglichen regulären Ausdruck zu verändern. Der Konstruktor erhält this und die ursprünglichen Flags sowie das Flag y („sticky“), falls es noch nicht vorhanden ist. Das Flag g („global“) hat keinen Einfluss auf das Verhalten der Methode. Aufgrund des Verhaltens des RegExp()-Konstruktors hat lastIndex standardmäßig zunächst den Wert 0.
Wenn die Zeichenfolge leer ist und der reguläre Ausdruck leere Zeichenfolgen finden kann (beispielsweise /a?/), wird ein leeres Array zurückgegeben. Kann der reguläre Ausdruck dagegen keine leere Zeichenfolge finden, wird [""] zurückgegeben.
Die Methode exec() des regulären Ausdrucks wird wiederholt aufgerufen, wobei lastIndex jedes Mal erhöht wird, bis das Ende der Zeichenfolge erreicht ist. Wenn der aktuelle Treffer eine leere Zeichenfolge ist oder der reguläre Ausdruck an der aktuellen Position keinen Treffer liefert (da er „sticky“ ist), wird lastIndex dennoch erhöht: Ist der reguläre Ausdruck Unicode-fähig, geschieht dies um einen Unicode-Codepunkt, andernfalls um eine UTF-16-Codeeinheit.
console.log("😄".split(/(?:)/g)); // [ '\ud83d', '\ude04' ]
console.log("😄".split(/(?:)/gu)); // [ '😄' ]
Für jeden Treffer wird zunächst die Teilzeichenfolge zwischen dem Ende des vorherigen Treffers und dem Anfang des aktuellen Treffers an das Ergebnis-Array angehängt. Anschließend werden die Werte der Capturing Groups einzeln angehängt. Die Länge des zurückgegebenen Arrays überschreitet den Parameter limit nicht, sofern er angegeben wurde; zugleich wird versucht, möglichst nahe an diesen Wert heranzukommen. Daher sind der letzte Treffer und seine Capturing Groups möglicherweise nicht vollständig im zurückgegebenen Array enthalten, wenn es bereits gefüllt ist.
Wenn an keiner Stelle der Zeichenfolge ein Treffer gefunden wurde, wird die ursprüngliche Zeichenfolge unverändert in einem Array zurückgegeben.
Beispiele
>Direkter Aufruf
Diese Methode kann fast genauso wie String.prototype.split() verwendet werden. Allerdings unterscheiden sich this und die Reihenfolge der Argumente.
const re = /-/g;
const str = "2016-01-02";
const result = re[Symbol.split](str);
console.log(result); // ["2016", "01", "02"]
[Symbol.split]() in Unterklassen verwenden
Unterklassen von RegExp können die Methode [Symbol.split]() überschreiben, um das Standardverhalten zu ändern.
class MyRegExp extends RegExp {
[Symbol.split](str, limit) {
const result = RegExp.prototype[Symbol.split].call(this, str, limit);
return result.map((x) => `(${x})`);
}
}
const re = new MyRegExp("-");
const str = "2016-01-02";
const result = str.split(re); // String.prototype.split calls re[Symbol.split]().
console.log(result); // ["(2016)", "(01)", "(02)"]
Spezifikationen
| Spezifikation |
|---|
| ECMAScript® 2027 Language Specification> # sec-regexp.prototype-%symbol.split%> |