String.prototype.replace()
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 replace()
Methode von String
-Werten gibt einen neuen String zurück, bei dem ein, einige oder alle Vorkommen eines pattern
durch ein replacement
ersetzt wurden. Das pattern
kann ein String oder ein RegExp
sein, und das replacement
kann ein String oder eine Funktion sein, die für jedes Vorkommen aufgerufen wird. Wenn pattern
ein String ist, wird nur das erste Vorkommen ersetzt. Der ursprüngliche String bleibt unverändert.
Probieren Sie es aus
Syntax
replace(pattern, replacement)
Parameter
pattern
-
Kann ein String oder ein Objekt mit einer
Symbol.replace
-Methode sein — das typische Beispiel ist ein regulärer Ausdruck. Jeder Wert, der nicht dieSymbol.replace
-Methode hat, wird in einen String umgewandelt. replacement
-
Kann ein String oder eine Funktion sein.
- Wenn es ein String ist, ersetzt es das Teilstück, das durch
pattern
gefunden wurde. Eine Anzahl spezieller Ersetzungs-Muster wird unterstützt; siehe den Abschnitt Ein String als Ersetzung angeben unten. - Wenn es eine Funktion ist, wird sie für jedes Vorkommen aufgerufen, und ihr Rückgabewert wird als Ersetzungstext verwendet. Die Argumente, die dieser Funktion übergeben werden, sind im Abschnitt Eine Funktion als Ersetzung angeben beschrieben.
- Wenn es ein String ist, ersetzt es das Teilstück, das durch
Rückgabewert
Ein neuer String, bei dem ein, einige oder alle Vorkommen des patterns durch die angegebene Ersetzung ersetzt wurden.
Beschreibung
Diese Methode verändert den String-Wert, auf die sie aufgerufen wird, nicht. Sie gibt einen neuen String zurück.
Ein String-Pattern wird nur einmal ersetzt. Um eine globale Suche und Ersetzung durchzuführen, verwenden Sie einen regulären Ausdruck mit dem g
-Flag oder verwenden Sie replaceAll()
.
Wenn pattern
ein Objekt mit einer Symbol.replace
-Methode ist (einschließlich RegExp
-Objekte), wird diese Methode mit dem Zielstring und replacement
als Argumente aufgerufen. Ihr Rückgabewert wird zum Rückgabewert von replace()
. In diesem Fall ist das Verhalten von replace()
vollständig durch die [Symbol.replace]()
-Methode codiert — beispielsweise sind alle Erwähnungen von "Capturing Groups" in der Beschreibung unten tatsächlich Funktionalitäten, die von RegExp.prototype[Symbol.replace]()
bereitgestellt werden.
Wenn das pattern
ein leerer String ist, wird die Ersetzung dem Anfang des Strings vorangestellt.
"xxx".replace("", "_"); // "_xxx"
Ein Regexp mit dem g
-Flag ist der einzige Fall, in dem replace()
mehrfach ersetzt. Weitere Informationen darüber, wie Regex-Eigenschaften (insbesondere das sticky-Flag) mit replace()
interagieren, finden Sie in RegExp.prototype[Symbol.replace]()
.
Ein String als Ersetzung angeben
Der Ersetzungsstring kann die folgenden speziellen Ersetzungsmuster enthalten:
Pattern | Fügt ein |
---|---|
$$ |
Fügt ein "$" ein. |
$& |
Fügt das gefundene Teilstück ein. |
$` |
Fügt den Streckenteil des Strings ein, der dem gefundenen Teilstück vorausgeht. |
$' |
Fügt den Streckenteil des Strings ein, der dem gefundenen Teilstück folgt. |
$n |
Fügt die n -te (1 -indexierte) Capturing Group ein, wobei n eine positive Ganzzahl kleiner als 100 ist. |
$<Name> |
Fügt die benannte Capturing Group ein, wobei Name der Gruppenname ist. |
$n
und $<Name>
sind nur verfügbar, wenn das pattern
-Argument ein RegExp
-Objekt ist. Wenn das pattern
ein String ist oder wenn die entsprechende Capturing Group im Regex nicht vorhanden ist, wird das Muster als Literal ersetzt. Wenn die Gruppe vorhanden ist, aber nicht abgeglichen wird (weil sie Teil einer Disjunktion ist), wird sie durch einen leeren String ersetzt.
"foo".replace(/(f)/, "$2");
// "$2oo"; the regex doesn't have the second group
"foo".replace("f", "$1");
// "$1oo"; the pattern is a string, so it doesn't have any groups
"foo".replace(/(f)|(g)/, "$2");
// "oo"; the second group exists but isn't matched
Eine Funktion als Ersetzung angeben
Sie können eine Funktion als zweiten Parameter spezifizieren. In diesem Fall wird die Funktion aufgerufen, nachdem das Vorkommen gefunden wurde. Das Ergebnis der Funktion (Rückgabewert) wird als Ersetzungs-String verwendet.
Hinweis: Die oben genannten speziellen Ersetzungsmuster gelten nicht für Strings, die von der Ersetzungsfunktion zurückgegeben werden.
Die Funktion hat folgende Signatur:
function replacer(match, p1, p2, /* …, */ pN, offset, string, groups) {
return replacement;
}
Die Argumente der Funktion sind wie folgt:
match
-
Das gefundene Teilstück. (Entspricht
$&
oben.) p1
,p2
, …,pN
-
Der
n
-te String, der von einer Capturing Group gefunden wurde (einschließlich benannter Capturing Groups), vorausgesetzt das erste Argument fürreplace()
ist einRegExp
-Objekt. (Entspricht$1
,$2
usw. oben.) Wenn beispielsweise daspattern
/(\a+)(\b+)/
ist, dann istp1
der Treffer für\a+
, undp2
ist der Treffer für\b+
. Wenn die Gruppe Teil einer Disjunktion ist (z. B."abc".replace(/(a)|(b)/, replacer)
), wird die nicht abgeglichene Alternativeundefined
sein. offset
-
Der Versatz des gefundenen Teilstücks innerhalb des gesamten untersuchten Strings. Zum Beispiel, wenn der gesamte String
'abcd'
ist und das gefundene Teilstück'bc'
, dann wird dieses Argument1
sein. string
-
Der gesamte zu untersuchende String.
groups
-
Ein Objekt, dessen Schlüssel die verwendeten Gruppennamen sind und dessen Werte die gefundenen Teile (falls nicht gefunden,
undefined
) sind. Nur vorhanden, wennpattern
mindestens eine benannte Capturing Group enthält.
Die genaue Anzahl von Argumenten hängt davon ab, ob das erste Argument ein RegExp
-Objekt ist — und wenn ja, wie viele Capturing Groups es hat.
Das folgende Beispiel wird newString
auf 'abc - 12345 - #$*%'
setzen:
function replacer(match, p1, p2, p3, offset, string) {
// p1 is non-digits, p2 digits, and p3 non-alphanumerics
return [p1, p2, p3].join(" - ");
}
const newString = "abc12345#$*%".replace(/([^\d]*)(\d*)([^\w]*)/, replacer);
console.log(newString); // abc - 12345 - #$*%
Die Funktion wird mehrfach für jedes vollständige Vorkommen aufgerufen, das ersetzt werden soll, wenn der reguläre Ausdruck im ersten Parameter global ist.
Beispiele
Den regulären Ausdruck in replace() definieren
Im folgenden Beispiel wird der reguläre Ausdruck in replace()
definiert und enthält das Ignorieren von Groß-/Kleinschreibung.
const str = "Twas the night before Xmas...";
const newstr = str.replace(/xmas/i, "Christmas");
console.log(newstr); // Twas the night before Christmas...
Dies protokolliert 'Twas the night before Christmas...'
.
Hinweis: Siehe den regulären Ausdrucks-Leitfaden für weitere Erklärungen zu regulären Ausdrücken.
Verwenden der globalen und ignoreCase-Flags mit replace()
Globale Ersetzungen können nur mit einem regulären Ausdruck durchgeführt werden. Im folgenden Beispiel enthält der reguläre Ausdruck die Flags für global und ignore case, die es replace()
erlauben, jedes Vorkommen von 'apples'
im String durch 'oranges'
zu ersetzen.
const re = /apples/gi;
const str = "Apples are round, and apples are juicy.";
const newstr = str.replace(re, "oranges");
console.log(newstr); // oranges are round, and oranges are juicy.
Dies protokolliert 'oranges are round, and oranges are juicy'
.
Wörter in einem String austauschen
Das folgende Skript tauscht die Wörter im String aus. Für den Ersetzungstext verwendet das Skript Capturing Groups und die Ersetzungsmuster $1
und $2
.
const re = /(\w+)\s(\w+)/;
const str = "Maria Cruz";
const newstr = str.replace(re, "$2, $1");
console.log(newstr); // Cruz, Maria
Dies protokolliert 'Cruz, Maria'
.
Verwenden einer Inline-Funktion, die die gefundenen Zeichen ändert
In diesem Beispiel werden alle Vorkommen von Großbuchstaben im String in Kleinbuchstaben umgewandelt, und ein Bindestrich wird direkt vor der Fundstelle eingefügt. Das Wichtige hier ist, dass zusätzliche Operationen am gefundenen Element erforderlich sind, bevor es als Ersatz zurückgegeben wird.
Die Ersetzungsfunktion akzeptiert das gefundene Stück als Parameter und verwendet es, um den Fall zu transformieren und den Bindestrich zu verketten, bevor sie es zurückgibt.
function styleHyphenFormat(propertyName) {
function upperToHyphenLower(match, offset, string) {
return (offset > 0 ? "-" : "") + match.toLowerCase();
}
return propertyName.replace(/[A-Z]/g, upperToHyphenLower);
}
Bei Verwendung von styleHyphenFormat('borderTop')
wird dies zu 'border-top'
zurückgegeben.
Da wir das Ergebnis des Treffers weiter transformieren möchten, bevor die endgültige Ersetzung vorgenommen wird, müssen wir eine Funktion verwenden. Dies erzwingt die Auswertung des Treffers vor der toLowerCase()
-Methode. Hätten wir versucht, dies ohne eine Funktion mit dem Treffer zu machen, hätte toLowerCase()
keine Wirkung gehabt.
// Won't work
const newString = propertyName.replace(/[A-Z]/g, "-" + "$&".toLowerCase());
Dies liegt daran, dass '$&'.toLowerCase()
zuerst als String-Literal ausgewertet würde (was zu demselben '$&'
führt), bevor die Zeichen als Muster verwendet würden.
Ersetzen eines Fahrenheit-Grades durch seinen Celsius-Äquivalent
Das folgende Beispiel ersetzt ein Fahrenheit-Grad durch sein entsprechendes Celsius-Grad. Das Fahrenheit-Grad sollte eine Zahl sein, die mit "F"
endet. Die Funktion gibt die Celsius-Zahl zurück, die mit "C"
endet. Wenn die Eingabezahl "212F"
ist, gibt die Funktion "100C"
zurück. Wenn die Zahl "0F"
ist, gibt die Funktion "-17.77777777777778C"
zurück.
Der reguläre Ausdruck test
überprüft jede Zahl, die mit F
endet. Die Anzahl der Fahrenheit-Grade ist für die Funktion über ihren zweiten Parameter p1
zugänglich. Die Funktion setzt die Celsius-Zahl basierend auf der Anzahl der Fahrenheit-Grade, die in einem String an die f2c()
-Funktion übergeben wird. f2c()
gibt dann die Celsius-Zahl zurück. Diese Funktion nähert das Perl-Flag s///e
an.
function f2c(x) {
function convert(str, p1, offset, s) {
return `${((p1 - 32) * 5) / 9}C`;
}
const s = String(x);
const test = /(-?\d+(?:\.\d*)?)F\b/g;
return s.replace(test, convert);
}
Einen generischen Ersetzer erstellen
Angenommen, wir möchten einen Ersetzer erstellen, der die Offset-Daten an jeden gefundenen String anhängt. Da die Ersetzerfunktion bereits den Parameter offset
erhält, wird es trivial sein, wenn das Regex statisch bekannt ist.
"abcd".replace(/(bc)/, (match, p1, offset) => `${match} (${offset}) `);
// "abc (1) d"
Dieser Ersetzer wäre jedoch schwer zu verallgemeinern, wenn wir möchten, dass er mit jedem Regex-Muster funktioniert. Der Ersetzer ist variadic — die Anzahl der Argumente, die er erhält, hängt von der Anzahl der vorhandenen Capturing Groups ab. Wir können Restparameter verwenden, aber es würde auch offset
, string
, usw. im Array sammeln. Die Tatsache, dass groups
je nach Identität des Regex übergeben oder nicht übergeben werden könnte, würde es auch erschweren, generell zu wissen, welches Argument dem offset
entspricht.
function addOffset(match, ...args) {
const offset = args.at(-2);
return `${match} (${offset}) `;
}
console.log("abcd".replace(/(bc)/, addOffset)); // "abc (1) d"
console.log("abcd".replace(/(?<group>bc)/, addOffset)); // "abc (abcd) d"
Das oben angegebene addOffset
-Beispiel funktioniert nicht, wenn das Regex eine benannte Gruppe enthält, da in diesem Fall args.at(-2)
der string
anstelle des offset
wäre.
Stattdessen müssen Sie die letzten paar Argumente basierend auf dem Typ extrahieren, da groups
ein Objekt ist, während string
ein String ist.
function addOffset(match, ...args) {
const hasNamedGroups = typeof args.at(-1) === "object";
const offset = hasNamedGroups ? args.at(-3) : args.at(-2);
return `${match} (${offset}) `;
}
console.log("abcd".replace(/(bc)/, addOffset)); // "abc (1) d"
console.log("abcd".replace(/(?<group>bc)/, addOffset)); // "abc (1) d"
Spezifikationen
Specification |
---|
ECMAScript Language Specification # sec-string.prototype.replace |
Browser-Kompatibilität
BCD tables only load in the browser
Siehe auch
- Polyfill von
String.prototype.replace
incore-js
mit Korrekturen und Implementierung des modernen Verhaltens wieSymbol.replace
-Unterstützung - Regulärer Ausdrucks-Leitfaden
String.prototype.replaceAll()
String.prototype.match()
RegExp.prototype.exec()
RegExp.prototype.test()
Symbol.replace
RegExp.prototype[Symbol.replace]()