RegExp.prototype[Symbol.match]()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Die [Symbol.match]()
Methode von RegExp
Instanzen legt fest, wie String.prototype.match()
sich verhalten soll. Darüber hinaus kann ihre Anwesenheit (oder Abwesenheit) beeinflussen, ob ein Objekt als regulärer Ausdruck angesehen 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("([0-9]+)-([0-9]+)-([0-9]+)")));
// 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
g
-Flag verwendet wird, werden alle Ergebnisse, die dem vollständigen regulären Ausdruck entsprechen, zurückgegeben, aber ohne Erfassungsgruppen. - Wenn das
g
-Flag nicht verwendet wird, wird nur die erste vollständige Übereinstimmung und ihre zugehörigen Erfassungsgruppen zurückgegeben. In diesem Fall wirdmatch()
dasselbe Ergebnis wieRegExp.prototype.exec()
zurückgeben (ein Array mit einigen zusätzlichen Eigenschaften).
Beschreibung
Diese Methode 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 die exec()
Methode des regulären Ausdrucks wiederholt aufgerufen, bis exec()
null
zurückgibt. Andernfalls würde exec()
nur einmal aufgerufen und sein Ergebnis wird der Rückgabewert von [Symbol.match]()
.
Da [Symbol.match]()
exec()
so lange aufrufen würde, bis es null
zurückgibt, und exec()
den lastIndex
des regulären Ausdrucks automatisch auf 0 zurücksetzt, wenn die letzte Übereinstimmung fehlschlägt, hätte [Symbol.match]()
typischerweise keine Seiteneffekte, wenn es beendet wird. Wenn der reguläre Ausdruck jedoch sticky ist, aber nicht global, würde lastIndex
nicht zurückgesetzt werden. In diesem Fall kann jeder Aufruf von match()
ein anderes Ergebnis zurückgeben.
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-Matches durchführen — d.h. er würde keine Vorkommen über den lastIndex
hinaus finden.
console.log("ab-c".match(/[abc]/gy)); // [ 'a', 'b' ]
Wenn die aktuelle Übereinstimmung eine leere Zeichenfolge ist, würde der lastIndex
dennoch erhöht werden — wenn der reguläre Ausdruck Unicode-fähig ist, würde er um einen Unicode Codepunkt erhöht; andernfalls wird er um eine UTF-16 Codeeinheit erhöht.
console.log("😄".match(/(?:)/g)); // [ '', '', '' ]
console.log("😄".match(/(?:)/gu)); // [ '', '' ]
Diese Methode existiert, um das Abgleichsverhalten innerhalb von RegExp
Subklassen anzupassen.
Darüber hinaus wird die [Symbol.match]
Eigenschaft verwendet, um zu überprüfen, ob ein Objekt ein regulärer Ausdruck ist.
Beispiele
Direkter Aufruf
Diese Methode kann in fast derselben Weise wie String.prototype.match()
verwendet werden, außer der unterschiedlichen this
und der unterschiedlichen Argumentenreihenfolge.
const re = /[0-9]+/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 Methode [Symbol.match]()
ü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("([0-9]+)-([0-9]+)-([0-9]+)");
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
Specification |
---|
ECMAScript® 2026 Language Specification # sec-regexp.prototype-%symbol.match% |