
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?

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

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

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/

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
9860300cookie-checkSo ersetzen Sie alle Vorkommen einer Zeichenfolge in JavaScriptyes
Beim Ersetzen aller Vorkommen von
aba
inababa
mitca
welches 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