814 Stimmen

Schnellste Methode zum Ersetzen aller Instanzen eines Zeichens in einer Zeichenkette

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?

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.

4voto

Frank W. Zammetti Punkte 1221

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!

3voto

MadHatter Punkte 39
// 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;
};

1voto

Franci Penov Punkte 73239

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.

0voto

Surya R Praveen Punkte 2847

@Gumbo fügt zusätzliche Antwort hinzu - user.email.replace(/foo/gi, "bar");

/foo/g - Refers to the all string to replace matching the case sensitive

/foo/gi - Refers to the without case sensitive and replace all For Eg: (Foo, foo, FoO, fOO)

DEMO

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X