RegExp.prototype[Symbol.match]()
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit September 2016 browserübergreifend verfügbar.
Die [Symbol.match]() Methode von RegExp Instanzen definiert, wie String.prototype.match() sich verhalten soll. Außerdem kann seine Anwesenheit (oder Abwesenheit) beeinflussen, ob ein Objekt als regulärer Ausdruck betrachtet wird.
Probieren Sie es aus
class RegExp1 extends RegExp {
[Symbol.match](str) {
const result = RegExp.prototype[Symbol.match].call(this, str);
if (result) {
return "VALID";
}
return "INVALID";
}
}
console.log("2012-07-02".match(new RegExp1("(\\d+)-(\\d+)-(\\d+)")));
// Expected output: "VALID"
Syntax
regexp[Symbol.match](str)
Parameter
Rückgabewert
Ein Array, dessen Inhalt von der Anwesenheit oder Abwesenheit des globalen (g) Flags abhängt, oder null, wenn keine Treffer gefunden werden.
- Wenn das
gFlag verwendet wird, werden alle Ergebnisse zurückgegeben, die dem vollständigen regulären Ausdruck entsprechen, aber Capturing-Gruppen sind nicht enthalten. - Wenn das
gFlag nicht verwendet wird, wird nur der erste vollständige Treffer und die zugehörigen Capturing-Gruppen zurückgegeben. In diesem Fall liefertmatch()dasselbe Ergebnis wieRegExp.prototype.exec()(ein Array mit einigen zusätzlichen Eigenschaften).
Beschreibung
Diese Methode existiert, um das Abgleichsverhalten in RegExp-Unterklassen anzupassen. Sie wird intern in String.prototype.match() aufgerufen. Zum Beispiel geben die folgenden zwei Beispiele dasselbe Ergebnis zurück.
"abc".match(/a/);
/a/[Symbol.match]("abc");
Wenn der reguläre Ausdruck global ist (mit dem g Flag), wird sein lastIndex zuerst auf 0 gesetzt, sodass das Matching immer am Anfang des Strings beginnt. Die Methode exec() wird wiederholt aufgerufen, bis exec() null zurückgibt. Wenn der aktuelle Treffer ein leerer String ist, würde lastIndex trotzdem erhöht werden — wenn der reguläre Ausdruck Unicode-bewusst ist, würde er um einen Unicode-Codepunkt erhöht werden; andernfalls wird er um eine UTF-16-Codeeinheit erhöht.
console.log("😄".match(/(?:)/g)); // [ '', '', '' ]
console.log("😄".match(/(?:)/gu)); // [ '', '' ]
Wenn der reguläre Ausdruck nicht global ist, würde exec() nur einmal aufgerufen werden und sein Ergebnis wird der Rückgabewert von [Symbol.match]().
Die Methode exec() setzt lastIndex automatisch auf 0 zurück, wenn der letzte Abgleich fehlschlägt, sodass [Symbol.match]() in der Regel keine Nebenwirkungen erzeugt, wenn lastIndex bei 0 startet. Wenn der reguläre Ausdruck jedoch sticky, aber nicht global ist, wird exec() nur einmal aufgerufen und setzt lastIndex nicht zurück, falls der Abgleich erfolgreich war. In diesem Fall kann jeder Aufruf von match() ein unterschiedliches Ergebnis liefern.
const re = /[abc]/y;
for (let i = 0; i < 5; i++) {
console.log("abc".match(re), re.lastIndex);
}
// [ 'a' ] 1
// [ 'b' ] 2
// [ 'c' ] 3
// null 0
// [ 'a' ] 1
Wenn der reguläre Ausdruck sticky und global ist, würde er dennoch sticky Abgleiche durchführen — das heißt, er würde scheitern, Übereinstimmungen jenseits des lastIndex zu finden.
console.log("ab-c".match(/[abc]/gy)); // [ 'a', 'b' ]
Außerdem wird die Eigenschaft [Symbol.match] verwendet, um zu überprüfen, ob ein Objekt ein regulärer Ausdruck ist.
Beispiele
>Direkter Aufruf
Diese Methode kann auf fast die gleiche Weise wie String.prototype.match() verwendet werden, mit Ausnahme des unterschiedlichen this und der abweichenden Argumentreihenfolge.
const re = /\d+/g;
const str = "2016-01-02";
const result = re[Symbol.match](str);
console.log(result); // ["2016", "01", "02"]
Verwendung von [Symbol.match]() in Unterklassen
Unterklassen von RegExp können die [Symbol.match]() Methode überschreiben, um das Standardverhalten zu ändern.
class MyRegExp extends RegExp {
[Symbol.match](str) {
const result = RegExp.prototype[Symbol.match].call(this, str);
if (!result) return null;
return {
group(n) {
return result[n];
},
};
}
}
const re = new MyRegExp("(\\d+)-(\\d+)-(\\d+)");
const str = "2016-01-02";
const result = str.match(re); // String.prototype.match calls re[Symbol.match]().
console.log(result.group(1)); // 2016
console.log(result.group(2)); // 01
console.log(result.group(3)); // 02
Spezifikationen
| Spezifikation |
|---|
| ECMAScript® 2027 Language Specification> # sec-regexp.prototype-%symbol.match%> |