Versuchen Sie dieses replaceAll: http://dumpsite.com/forum/index.php?topic=4.msg8#msg8
String.prototype.replaceAll = function(str1, str2, ignore)
{
return this.replace(new RegExp(str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g,"\\$&"),(ignore?"gi":"g")),(typeof(str2)=="string")?str2.replace(/\$/g,"$$$$"):str2);
}
Es ist sehr schnell, und es funktioniert unter ALLEN Bedingungen an denen viele andere scheitern:
"x".replaceAll("x", "xyz");
// xyz
"x".replaceAll("", "xyz");
// xyzxxyz
"aA".replaceAll("a", "b", true);
// bb
"Hello???".replaceAll("?", "!");
// Hello!!!
Lassen Sie es mich wissen, wenn Sie es knacken können oder etwas Besseres haben, aber stellen Sie sicher, dass es diese 4 Tests bestehen kann.
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)