Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
RegExp.prototype[Symbol.replace]()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since Januar 2020.
Die Methode[Symbol.replace]() vonRegExp-Instanzen legt fest, wieString.prototype.replace() undString.prototype.replaceAll() funktionieren sollen, wenn der reguläre Ausdruck als Muster übergeben wird.
In diesem Artikel
Probieren Sie es aus
class RegExp1 extends RegExp { [Symbol.replace](str) { return RegExp.prototype[Symbol.replace].call(this, str, "#!@?"); }}console.log("football".replace(new RegExp1("foo")));// Expected output: "#!@?tball"Syntax
regexp[Symbol.replace](str, replacement)Parameter
strEin
String, der das Ziel des Ersetzens ist.replacementKann ein String oder eine Funktion sein.
- Wenn es ein String ist, ersetzt er den Teilstring, der vom aktuellen Regexp übereingestimmt wird. Eine Reihe von speziellen Ersetzungsmustern wird unterstützt; siehe den AbschnittEinen String als Ersetzung angeben von
String.prototype.replace. - Wenn es eine Funktion ist, wird diese für jedes Übereinstimmung aufgerufen und der Rückgabewert wird als Ersetzungstext verwendet. Die an diese Funktion übergebenen Argumente sind im AbschnittEine Funktion als Ersetzung angeben von
String.prototype.replacebeschrieben.
- Wenn es ein String ist, ersetzt er den Teilstring, der vom aktuellen Regexp übereingestimmt wird. Eine Reihe von speziellen Ersetzungsmustern wird unterstützt; siehe den AbschnittEinen String als Ersetzung angeben von
Rückgabewert
Ein neuer String, bei dem eines, einige oder alle Übereinstimmungen des Musters durch die angegebene Ersetzung ersetzt werden.
Beschreibung
Diese Methode wird intern inString.prototype.replace() undString.prototype.replaceAll() aufgerufen, wenn daspattern-Argument einRegExp-Objekt ist. So geben zum Beispiel die folgenden zwei Beispiele das gleiche Ergebnis zurück.
"abc".replace(/a/, "A");/a/[Symbol.replace]("abc", "A");Wenn der Regex global ist (mit demg-Flag), wird die Methodeexec() des Regex wiederholt aufgerufen, bisexec()null zurückgibt. Andernfalls würdeexec() nur einmal aufgerufen werden. Für jedes Ergebnis vonexec() wird die Ersetzung basierend auf der Beschreibung inString.prototype.replace() vorbereitet.
Da[Symbol.replace]()exec() weiterhin aufrufen würde, bis esnull zurückgibt, undexec() denlastIndex des Regex automatisch auf 0 zurücksetzt, wenn die letzte Übereinstimmung fehlschlägt, hätte[Symbol.replace]() typischerweise keine Nebeneffekte, wenn es beendet wird. Wenn der Regex jedochhaftend ist, aber nicht global, würdelastIndex nicht zurückgesetzt werden. In diesem Fall könnte jeder Aufruf vonreplace() ein anderes Ergebnis liefern.
const re = /a/y;for (let i = 0; i < 5; i++) { console.log("aaa".replace(re, "b"), re.lastIndex);}// baa 1// aba 2// aab 3// aaa 0// baa 1Wenn der Regex haftend und global ist, würde er weiterhin haftende Übereinstimmungen durchführen — d.h. er würde keine Vorkommen jenseits deslastIndex übereinstimmen.
console.log("aa-a".replace(/a/gy, "b")); // "bb-a"Wenn die aktuelle Übereinstimmung ein leerer String ist, würde derlastIndex trotzdem erhöht werden — wenn der RegexUnicode-bewusst ist, würde er um einen Unicode-Codepunkt erhöht; andernfalls wird er um eine UTF-16-Codeeinheit erhöht.
console.log("😄".replace(/(?:)/g, " ")); // " \ud83d \ude04 "console.log("😄".replace(/(?:)/gu, " ")); // " 😄 "Diese Methode existiert, um das Ersetzungsverhalten inRegExp-Unterklassen anzupassen.
Beispiele
>Direkter Aufruf
Diese Methode kann fast genauso wieString.prototype.replace() verwendet werden, mit Ausnahme der unterschiedlichenthis-Objekte und der unterschiedlichen Argumentreihenfolge.
const re = /-/g;const str = "2016-01-01";const newStr = re[Symbol.replace](str, ".");console.log(newStr); // 2016.01.01Verwendung von[Symbol.replace]() in Unterklassen
Unterklassen vonRegExp können die Methode[Symbol.replace]() überschreiben, um das Standardverhalten zu verändern.
class MyRegExp extends RegExp { constructor(pattern, flags, count) { super(pattern, flags); this.count = count; } [Symbol.replace](str, replacement) { // Perform [Symbol.replace]() `count` times. let result = str; for (let i = 0; i < this.count; i++) { result = RegExp.prototype[Symbol.replace].call(this, result, replacement); } return result; }}const re = new MyRegExp("\\d", "", 3);const str = "01234567";const newStr = str.replace(re, "#"); // String.prototype.replace calls re[Symbol.replace]().console.log(newStr); // ###34567Spezifikationen
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-regexp.prototype-%symbol.replace%> |
Browser-Kompatibilität
Siehe auch
- Polyfill von
RegExp.prototype[Symbol.replace]incore-js String.prototype.replace()String.prototype.replaceAll()RegExp.prototype[Symbol.match]()RegExp.prototype[Symbol.matchAll]()RegExp.prototype[Symbol.search]()RegExp.prototype[Symbol.split]()RegExp.prototype.exec()RegExp.prototype.test()Symbol.replace