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 September 2016.

Die [Symbol.match]() Methode von RegExp Instanzen legt fest, wie String.prototype.match() funktionieren soll. Darüber hinaus 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

js
regexp[Symbol.match](str)

Parameter

str

Ein String, der das Ziel des Abgleichs darstellt.

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 ganzen regulären Ausdruck entsprechen, zurückgegeben, aber Erfassungsgruppen sind nicht enthalten.
  • Wenn das g-Flag nicht verwendet wird, wird nur die erste vollständige Übereinstimmung und ihre zugehörigen Erfassungsgruppen zurückgegeben. In diesem Fall gibt match() dasselbe Ergebnis wie RegExp.prototype.exec() zurück (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.

js
"abc".match(/a/);

/a/[Symbol.match]("abc");

Wenn der reguläre Ausdruck global ist (mit dem g-Flag), wird die Methode exec() 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() immer wieder 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, hat [Symbol.match]() beim Beenden normalerweise keine Nebeneffekte. Allerdings wird lastIndex nicht zurückgesetzt, wenn der reguläre Ausdruck sticky aber nicht global ist. In diesem Fall kann jeder Aufruf von match() ein anderes Ergebnis liefern.

js
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, führen Sticky-Matches immer noch zu — d.h. es wird keine Übereinstimmungen über den lastIndex hinaus geben.

js
console.log("ab-c".match(/[abc]/gy)); // [ 'a', 'b' ]

Wenn die aktuelle Übereinstimmung ein leerer String ist, wird der lastIndex trotzdem weitergesetzt — ist der reguläre Ausdruck Unicode-aware, wird er um einen Unicode-Codepunkt weitergesetzt; andernfalls wird er um eine UTF-16 Code-Einheit weitergesetzt.

js
console.log("😄".match(/(?:)/g)); // [ '', '', '' ]
console.log("😄".match(/(?:)/gu)); // [ '', '' ]

Diese Methode existiert, um das Abgleichsverhalten innerhalb von RegExp-Unterklassen anzupassen.

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 fast auf die gleiche Weise wie String.prototype.match() verwendet werden, mit Ausnahme des unterschiedlichen this und der unterschiedlichen Reihenfolge der Argumente.

js
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.

js
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

Specification
ECMAScript® 2026 Language Specification
# sec-regexp.prototype-%symbol.match%

Browser-Kompatibilität

Siehe auch