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 der RegExp Instanzen spezifiziert, wie String.prototype.match() sich verhalten soll. Zusätzlich kann ihre 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 Übereinstimmungen gefunden werden.
- Wenn das
gFlag verwendet wird, werden alle Ergebnisse, die mit dem vollständigen regulären Ausdruck übereinstimmen, zurückgegeben, aber keine Capture-Gruppen sind enthalten. - Wenn das
gFlag nicht verwendet wird, wird nur die erste vollständige Übereinstimmung und ihre zugehörigen Capture-Gruppen zurückgegeben. In diesem Fall gibtmatch()dasselbe Ergebnis wieRegExp.prototype.exec()zurück (ein Array mit einigen zusätzlichen Eigenschaften).
Beschreibung
Diese Methode existiert zur Anpassung des Match-Verhaltens innerhalb von RegExp-Unterklassen. Sie wird intern in String.prototype.match() aufgerufen. Zum Beispiel liefern die folgenden zwei Beispiele dasselbe Ergebnis.
"abc".match(/a/);
/a/[Symbol.match]("abc");
Wenn der Regex global ist (mit dem g Flag), wird sein lastIndex zuerst auf 0 gesetzt, sodass das Matching immer vom Anfang des Strings beginnt, und die Methode exec() des Regex wird wiederholt aufgerufen, bis exec() null zurückgibt. Wenn die aktuelle Übereinstimmung eine leere Zeichenkette ist, würde der lastIndex trotzdem weiter geschoben — wenn der Regex Unicode-bewusst ist, würde er um einen Unicode-Codepunkte weiter schieben; andernfalls schiebt er um eine UTF-16-Codeeinheit weiter.
console.log("😄".match(/(?:)/g)); // [ '', '', '' ]
console.log("😄".match(/(?:)/gu)); // [ '', '' ]
Wenn der Regex nicht global ist, würde exec() nur einmal aufgerufen und sein Ergebnis wird der Rückgabewert von [Symbol.match]().
Die exec() Methode setzt lastIndex automatisch auf 0 zurück, wenn die letzte Übereinstimmung fehlschlägt, sodass für globale Regexe mit lastIndex, der bei 0 beginnt, [Symbol.match]() im Allgemeinen keine Nebeneffekte erzeugt. Wenn der Regex jedoch sticky ist, aber nicht global, wird exec() nur einmal aufgerufen und setzt daher lastIndex nicht zurück, wenn die Übereinstimmung erfolgreich war. In diesem Fall kann jeder Aufruf von match() ein anderes 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 Regex sticky und global ist, würde er trotzdem sticky Matches durchführen — d.h. er würde keine Vorkommen jenseits des lastIndex finden.
console.log("ab-c".match(/[abc]/gy)); // [ 'a', 'b' ]
Darüber hinaus wird die [Symbol.match] Eigenschaft verwendet, um zu prüfen, ob ein Objekt ein regulärer Ausdruck ist.
Beispiele
>Direkter Aufruf
Diese Methode kann auf fast dieselbe Weise wie String.prototype.match() verwendet werden, außer der unterschiedlichen this und der unterschiedlichen 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%> |