Was ist der schnellste Weg, um alle Instanzen einer Zeichenfolge/Zeichen in einer Zeichenfolge in JavaScript zu ersetzen? A while
, a for
-Schleife, einen regulären Ausdruck?
- Ersetzen aller Vorkommen einer Zeichenkette in JavaScript (79 Antworten )
Antworten
Zu viele Anzeigen?Ich habe einige dieser Vorschläge ausprobiert, nachdem ich festgestellt hatte, dass eine Implementierung, die ich vor fast 10 Jahren geschrieben hatte, nicht vollständig funktionierte (böser Produktionsfehler in einem längst vergessenen System, ist das nicht immer so?!)... Was mir aufgefallen ist, ist, dass die, die ich ausprobiert habe (ich habe nicht alle ausprobiert), das gleiche Problem wie meins hatten, d.h. sie haben nicht JEDES Vorkommen ersetzt, sondern nur das erste, zumindest in meinem Testfall, "test....txt" durch Ersetzen von ".." durch "..." in "test.txt" umzuwandeln... vielleicht habe ich eine Regex-Situation übersehen? Aber ich schweife ab...
Also habe ich meine Implementierung wie folgt umgeschrieben. Es ist ziemlich verflixt einfach, obwohl ich vermute, nicht die schnellste, aber ich glaube auch nicht, dass der Unterschied mit modernen JS-Engines eine Rolle spielen wird, es sei denn, Sie tun dies innerhalb einer engen Schleife natürlich, aber das ist immer der Fall für alles...
function replaceSubstring(inSource, inToReplace, inReplaceWith) {
var outString = inSource;
while (true) {
var idx = outString.indexOf(inToReplace);
if (idx == -1) {
break;
}
outString = outString.substring(0, idx) + inReplaceWith +
outString.substring(idx + inToReplace.length);
}
return outString;
}
Hoffentlich hilft das jemandem!
// Find, Replace, Case
// i.e "Test to see if this works? (Yes|No)".replaceAll('(Yes|No)', 'Yes!');
// i.e.2 "Test to see if this works? (Yes|No)".replaceAll('(yes|no)', 'Yes!', true);
String.prototype.replaceAll = function(_f, _r, _c){
var o = this.toString();
var r = '';
var s = o;
var b = 0;
var e = -1;
if(_c){ _f = _f.toLowerCase(); s = o.toLowerCase(); }
while((e=s.indexOf(_f)) > -1)
{
r += o.substring(b, b+e) + _r;
s = s.substring(e+_f.length, s.length);
b += e+_f.length;
}
// Add Leftover
if(s.length>0){ r+=o.substring(o.length-s.length, o.length); }
// Return New String
return r;
};
Verwenden Sie die replace()
Methode der String
Objekt.
Wie in der ausgewählten Antwort erwähnt, sollte das Flag /g in der Regex verwendet werden, um die alle Instanzen der Teilzeichenkette in der Zeichenkette.
- See previous answers
- Weitere Antworten anzeigen
4 Stimmen
Eine while- und eine for-Schleife würden beide mit einem einfachen Algorithmus in O(n) laufen. Nicht wirklich sicher, was ist die Zeitkomplexität für Javascript Regex-Engine in diesem Fall, aber meine Vermutung ist seine optimiert genug, um in O(n) für eine einfache String-Match laufen.
3 Stimmen
Dies scheint wie Mikro-Optimierung zu mir - hat Performance-Profiling zeigen die Zeichenfolge-Ersetzung zu den langsamsten Teil Ihres Programms sein?
0 Stimmen
Nein, ich habe mein Skript nicht einem Leistungsprofil unterzogen, ich wollte nur sicherstellen, dass ich die schnellste verfügbare Funktion verwende.
5 Stimmen
Ich habe einen JSPerf gemacht, der globale Regex und eine for-Schleife vergleicht: jsperf.com/javascript-ersetzen-alle . Wenn ich die Tests richtig geschrieben habe, sieht es so aus, als ob die Antwort "es kommt darauf an" lautet.
0 Stimmen
Nach diesem jsperf.com/split-join-vs-replace/16 die schnellste Methode ist die Verwendung von
split join
1 Stimmen
Mögliches Duplikat von Ersetzen aller Vorkommen einer Zeichenkette in JavaScript
0 Stimmen
Ich bin nicht sicher, wann
replace
wurde optimiert, abersplit
-join
ist jetzt etwa 40+% langsamer.0 Stimmen
Ich verstehe nicht, warum in Chrome 97,
replaceAll
(nativ) sollte langsamer sein alssplit().join()
im Umgang mit großen Strings? jsben.ch/AxKZ3 (In Firefox sieht es gut aus)