So ersetzen Sie alle Vorkommen einer Zeichenfolge in JavaScript

Lesezeit: 7 Minuten

1646884507 845 So ersetzen Sie alle Vorkommen einer Zeichenfolge in JavaScript
Ali

Ich habe diese Zeichenfolge in meinem JavaScript-Code:

"Test abc test test abc test test test abc test test abc"

Tun:

str = str.replace('abc', '');

Scheint nur das erste Vorkommen von zu entfernen abc in der Zeichenfolge oben.

Wie kann ich ersetzen alle Vorkommen davon?

  • Beim Ersetzen aller Vorkommen von aba in ababa mit cawelches Ergebnis erwarten Sie? caba? abca? cca?

    – reinierpost

    2. August 2019 um 12:58 Uhr

  • String.prototype.replaceAll() ist jetzt ein Standardbestandteil von ECMAScript tc39.es/ecma262/#sec-string.prototype.replacealldokumentiert bei developer.mozilla.org/docs/Web/JavaScript/Reference/… und ausgeliefert in Safari 13.1, Firefox 77 und Chrome Dev/Canary und ausgeliefert in Chrome 85. Aus den Dokumenten: „If Suchwert eine Zeichenfolge ist, ersetzt alle Vorkommen von Suchwert (als ob .split(searchValue).join(replaceValue) oder es wurde ein globaler und korrekt maskierter regulärer Ausdruck verwendet). Wenn Suchwert ist ein nicht-globaler regulärer Ausdruck, löst eine Ausnahme aus“

    – Seitenschaubarker

    29. Juni 2020 um 5:26 Uhr


  • Verwenden Sie Regex anstelle von String, sollte so aussehen str.replace(/abc/g, ''); so g, um alle Übereinstimmungen zu erhalten.

    – sarah

    29. Juli 2020 um 6:17 Uhr

1646884508 605 So ersetzen Sie alle Vorkommen einer Zeichenfolge in JavaScript
Cory Groß

Der Vollständigkeit halber habe ich darüber nachgedacht, mit welcher Methode ich das machen soll. Es gibt grundsätzlich zwei Möglichkeiten, dies zu tun, wie in den anderen Antworten auf dieser Seite vorgeschlagen.

Notiz: Generell wird davon abgeraten, die eingebauten Prototypen in JavaScript zu erweitern. Ich stelle lediglich zu Illustrationszwecken Erweiterungen des String-Prototypen bereit, die verschiedene Implementierungen einer hypothetischen Standardmethode auf dem zeigen String eingebauter Prototyp.


Auf regulären Ausdrücken basierende Implementierung

String.prototype.replaceAll = function(search, replacement) {
    var target = this;
    return target.replace(new RegExp(search, 'g'), replacement);
};

Split-and-Join (funktionale) Implementierung

String.prototype.replaceAll = function(search, replacement) {
    var target = this;
    return target.split(search).join(replacement);
};

Da ich nicht allzu viel darüber wusste, wie reguläre Ausdrücke in Bezug auf die Effizienz hinter den Kulissen funktionieren, neigte ich in der Vergangenheit eher zur Split-and-Join-Implementierung, ohne an die Leistung zu denken. Als ich mich fragte, was effizienter war und mit welcher Spanne, benutzte ich es als Ausrede, um es herauszufinden.

Auf meinem Chrome Windows 8-Computer die auf regulären Ausdrücken basierende Implementierung ist die schnellstemit dem Split-and-Join-Implementierung ist 53 % langsamer. Das bedeutet, dass die regulären Ausdrücke für die von mir verwendete Lorem-Ipsum-Eingabe doppelt so schnell sind.

Schau dir das an Benchmark Ausführen dieser beiden Implementierungen gegeneinander.


Wie im Kommentar unten von @ThomasLeduc und anderen angemerkt, könnte es ein Problem mit der auf regulären Ausdrücken basierenden Implementierung geben, wenn search enthält bestimmte Zeichen, die als reserviert sind Sonderzeichen in regulären Ausdrücken. Die Implementierung geht davon aus, dass der Aufrufer den String vorher maskiert oder nur Strings übergibt, die ohne die Zeichen in der Tabelle sind Reguläre Ausdrücke (MDN).

MDN bietet auch eine Implementierung, um unsere Zeichenfolgen zu maskieren. Es wäre schön, wenn dies auch so standardisiert wäre RegExp.escape(str)aber leider existiert es nicht:

function escapeRegExp(str) {
  return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
}

Wir könnten anrufen escapeRegExp innerhalb unserer String.prototype.replaceAll Ich bin mir jedoch nicht sicher, wie sehr sich dies auf die Leistung auswirkt (möglicherweise sogar für Zeichenfolgen, für die das Escape nicht erforderlich ist, wie alle alphanumerischen Zeichenfolgen).

  • Im Jahr 2021 String.prototype.replaceAll() nativ existieren. Daher sollte diese Implementierung vor der Verwendung zuerst überprüft werden.

    – MMMahdy-PAPION

    26. Dezember 2021 um 4:51 Uhr

  • Ich verwende nestjs, also zeigt das Typoskript den Fehler, dass replaceAll keine Methode des String-Prototyps ist. Gibt es eine Lösung dafür?

    – Sunil Garg

    5. Januar um 4:52

  • Ich rate davon ab, replaceAll zu diesem Zeitpunkt (2020) zu verwenden. Es wird von einigen Browsern, die in diesem Jahr aktualisiert wurden, nicht unterstützt caniuse.com/?search=replaceAll Es ist zu früh

    – Tom Smykowski

    19. Oktober 2020 um 18:31 Uhr

  • NodeJS unterstützt replaceAll in 15.x-Versionen.

    – Abion47

    25. Februar 2021 um 1:38 Uhr

  • Was tun bei Groß- und Kleinschreibung?

    – Kunal Tanwar

    27. August 2021 um 23:03 Uhr


  • Die einfache Ersetzungsfunktion des Benchmarks ist nicht das Äquivalent von Regex /g. “Wenn das Muster ein String ist, wird nur das erste Vorkommen ersetzt.” Bsp.: replaceAll_0(“foo bar foo”) => “bar foo”, obwohl es nur “bar” sein sollte. –MDN

    – Tristan Vorwärts

    12. Februar um 15:30 Uhr


1646884508 132 So ersetzen Sie alle Vorkommen einer Zeichenfolge in JavaScript
Adam A

Verwenden eines regulären Ausdrucks mit der g Das Flag-Set ersetzt alle:

someString = 'the cat looks like a cat';
anotherString = someString.replace(/cat/g, 'dog');
// anotherString now contains "the dog looks like a dog"

Siehe auch hier

1646884509 620 So ersetzen Sie alle Vorkommen einer Zeichenfolge in JavaScript
Mario Petrovic

Hier ist eine Zeichenfolgenprototypfunktion, die auf der akzeptierten Antwort basiert:

String.prototype.replaceAll = function (find, replace) {
    var str = this;
    return str.replace(new RegExp(find, 'g'), replace);
};

BEARBEITEN

Wenn dein find enthält Sonderzeichen, dann müssen Sie ihnen entkommen:

String.prototype.replaceAll = function (find, replace) {
    var str = this;
    return str.replace(new RegExp(find.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'), replace);
};

Geige: http://jsfiddle.net/cdbzL/

1646884509 620 So ersetzen Sie alle Vorkommen einer Zeichenfolge in JavaScript
Mario Petrovic

Aktualisieren:

Es ist etwas spät für ein Update, aber da ich gerade über diese Frage gestolpert bin und festgestellt habe, dass meine vorherige Antwort nicht zufrieden ist. Da es bei der Frage darum ging, ein einzelnes Wort zu ersetzen, ist es unglaublich, dass niemand daran gedacht hat, Wortgrenzen zu verwenden (\b)

'a cat is not a caterpillar'.replace(/\bcat\b/gi,'dog');
//"a dog is not a caterpillar"

Dies ist eine einfache Regex, die in den meisten Fällen das Ersetzen von Wortteilen vermeidet. Allerdings ein Strich - gilt immer noch als Wortgrenze. Daher können in diesem Fall Bedingungen verwendet werden, um das Ersetzen von Zeichenfolgen wie zu vermeiden cool-cat:

'a cat is not a cool-cat'.replace(/\bcat\b/gi,'dog');//wrong
//"a dog is not a cool-dog" -- nips
'a cat is not a cool-cat'.replace(/(?:\b([^-]))cat(?:\b([^-]))/gi,'$1dog$2');
//"a dog is not a cool-cat"

Im Grunde ist diese Frage die gleiche wie die Frage hier: Javascript ersetzen Sie ” ‘ ” durch ” ” “

@Mike, überprüfe die Antwort, die ich dort gegeben habe … regexp ist nicht die einzige Möglichkeit, mehrere Vorkommen eines subsrting zu ersetzen, weit davon entfernt. Denken Sie flexibel, denken Sie aufgeteilt!

var newText = "the cat looks like a cat".split('cat').join('dog');

Alternativ, um zu verhindern, dass Wortteile ersetzt werden – was auch die genehmigte Antwort tut! Sie können dieses Problem umgehen, indem Sie reguläre Ausdrücke verwenden, die zugegebenermaßen etwas komplexer und folglich auch etwas langsamer sind:

var regText = "the cat looks like a cat".replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");

Die Ausgabe ist die gleiche wie die akzeptierte Antwort, jedoch mit der /cat/g Ausdruck auf dieser Zeichenfolge:

var oops="the cat looks like a cat, not a caterpillar or coolcat".replace(/cat/g,'dog');
//returns "the dog looks like a dog, not a dogerpillar or cooldog" ?? 

Hoppla, das ist wahrscheinlich nicht das, was Sie wollen. Was ist dann? IMHO, eine Regex, die ‘cat’ nur bedingt ersetzt. (dh kein Teil eines Wortes), etwa so:

var caterpillar="the cat looks like a cat, not a caterpillar or coolcat".replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");
//return "the dog looks like a dog, not a caterpillar or coolcat"

Meine Vermutung ist, dass dies Ihren Anforderungen entspricht. Das ist natürlich kein Beweis, aber für den Anfang sollte es reichen. Ich würde empfehlen, etwas mehr auf diesen Seiten zu lesen. Dies wird sich als nützlich erweisen, um diesen Ausdruck zu perfektionieren, um Ihren spezifischen Anforderungen gerecht zu werden.

http://www.javascriptkit.com/jsref/regexp.shtml

http://www.regular-expressions.info


Letzte Ergänzung:

Angesichts der Tatsache, dass diese Frage immer noch viele Ansichten erhält, dachte ich, ich könnte ein Beispiel hinzufügen .replace mit einer Callback-Funktion verwendet. In diesem Fall vereinfacht es den Ausdruck dramatisch und bietet noch mehr Flexibilität, z. B. das Ersetzen durch die richtige Großschreibung oder das Ersetzen beider cat und cats auf einmal:

'Two cats are not 1 Cat! They\'re just cool-cats, you caterpillar'
   .replace(/(^|.\b)(cat)(s?\b.|$)/gi,function(all,char1,cat,char2)
    {
       //check 1st, capitalize if required
       var replacement = (cat.charAt(0) === 'C' ? 'D' : 'd') + 'og';
       if (char1 === ' ' && char2 === 's')
       {//replace plurals, too
           cat = replacement + 's';
       }
       else
       {//do not replace if dashes are matched
           cat = char1 === '-' || char2 === '-' ? cat : replacement;
       }
       return char1 + cat + char2;//return replacement string
    });
//returns:
//Two dogs are not 1 Dog! They're just cool-cats, you caterpillar

986030cookie-checkSo ersetzen Sie alle Vorkommen einer Zeichenfolge in JavaScript

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy