Wie kann ich in Javascript ein globales Ersetzen einer Zeichenfolge mit einer Variablen in '/' und '/ g' durchführen?

75

Ich möchte eine globale Ersetzung der Zeichenfolge mithilfe von String.replace in Javascript durchführen.

In der Dokumentation habe ich gelesen, dass ich dies mit / g tun kann, dh zum Beispiel;

var mystring = mystring.replace(/test/g, mystring);

und dies wird alle Vorkommen innerhalb von mystring ersetzen. Keine Anführungszeichen für den Ausdruck.

Aber wenn ich eine Variable zu finden habe, wie kann ich das ohne Anführungszeichen tun?

Ich habe so etwas versucht:

var stringToFind = "test";

//erster Versuch

mystring = mystring.replace('/' + stringToFind + '/g', mystring);

// zweiter Versuch, überhaupt nicht viel Sinn

mystring = mystring.replace(/stringToFind/g, mystring);

aber sie funktionieren nicht. Irgendwelche Ideen?

Eric Wendelin
quelle
2
Ihre Frage wird hier beantwortet: stackoverflow.com/questions/494035/…
Eric Wendelin

Antworten:

-17

Können Sie prototype.js verwenden? Wenn ja, könnten Sie String.gsub verwenden, wie

var myStr = "a day in a life of a thing";
 var replace = "a";
 var resultString = myStr.gsub(replace, "g");
 // resultString will be "g day in g life of g thing"

Es werden auch reguläre Ausdrücke verwendet. Für mich ist dies eine der eleganteren Möglichkeiten, es zu lösen. prototypejs gsub Dokumentation

Heat Miser
quelle
15
Es gibt eine viel einfachere Lösung, die eigentlich ziemlich effizient ist : myStr.split('a').join('g'). Benötigt auch nicht prototype.js.
Wolkenfüße
2
Dies ist keine hilfreiche Antwort, da es einfache, standardkonforme Möglichkeiten gibt, dasselbe zu erreichen.
Rmcclellan
@cloudfeet: Ihre ist in der Tat eine sehr einfache Lösung, aber Sie fragen sich nur, welche effizienter sein wird - Verwenden Sie ein RegExp-Objekt (Lösung von Paolo Bergantino unten) oder Ihre Lösung, die ein Array im laufenden Betrieb erstellt und dann die Array-Elemente verbindet?
Mandeep Singh
201
var mystring = "hello world test world";
var find = "world";
var regex = new RegExp(find, "g");
alert(mystring.replace(regex, "yay")); // alerts "hello yay test yay"

Falls Sie dies in eine Funktion benötigen

  replaceGlobally(original, searchTxt, replaceTxt) {
    const regex = new RegExp(searchTxt, 'g');
    return original.replace(regex, replaceTxt) ;
  }
Paolo Bergantino
quelle
Sie hätten dies einfacher machen können: alert (mystring.replace (neues RegExp ("world", "g"), "yay"))
ColorCodin
84

Für Regex , new RegExp(stringtofind, 'g');. ABER. Wenn 'find' Zeichen enthält, die für Regex besonders sind, haben sie ihre Regexy-Bedeutung. Wenn Sie also versucht haben, das '.' In 'abc.def' mit 'x' erhalten Sie 'xxxxxxx' - whoops.

Wenn Sie nur einen einfachen String-Ersatz wünschen, sind keine regulären Ausdrücke erforderlich! Hier ist die einfache Zeichenfolge zum Ersetzen von Zeichenfolgen:

mystring= mystring.split(stringtofind).join(replacementstring);
Bobince
quelle
2
+1 immer gut zu sehen, wie Menschen über die wörtliche Antwort auf die Frage hinaus denken.
Thomas
Ich frage mich, wie sich dies für größere Zeichenfolgen im Vergleich zum RegExp () -Aufruf verschlechtert.
Kato
3
@Kato Ich war auch neugierig, also habe ich einen jsperf-Leistungstest erstellt, um das herauszufinden. link: goo.gl/cbZiV
starbeamrainbowlabs
1
Überprüfen Sie einfach Firefox und Regex ist am schnellsten. (Ich habe vorher Chrom verwendet)
starbeamrainbowlabs
1
@starbeamrainbowlabs sehr interessante Ergebnisse! Guter alter IE; immer unvorhersehbar schlecht in zufälligen, scheinbar wichtigen Dingen
Kato
39

Reguläre Ausdrücke sind viel langsamer als die Zeichenfolgensuche. Das Erstellen von regulären Ausdrücken mit maskierten Suchzeichenfolgen ist daher kein optimaler Weg. Selbst eine Schleife durch die Zeichenfolge wäre schneller, aber ich schlage vor, integrierte vorkompilierte Methoden zu verwenden.

Hier ist eine schnelle und saubere Methode zum schnellen Ersetzen globaler Zeichenfolgen:

sMyString.split(sSearch).join(sReplace);

Und das ist es.

Lex
quelle
16
String.prototype.replaceAll = function (replaceThis, withThis) {
   var re = new RegExp(RegExp.quote(replaceThis),"g"); 
   return this.replace(re, withThis);
};


RegExp.quote = function(str) {
     return str.replace(/([.?*+^$[\]\\(){}-])/g, "\\$1");
};

var aa = "qwerr.erer".replaceAll(".","A");
alert(aa);

Silmiar Post

unigogo
quelle
2
Meine Implementierung ist etwas strengerstr.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\,\\\^\$\|\#\s]/g, '\\$&')
Andrei Neculau
7

Mit der folgenden Lösung können Sie eine Zeichenfolge mit einer Variablen in '/' und '/ g' global ersetzen:

myString.replace(new RegExp(strFind, 'g'), strReplace);
dSd
quelle
Dies ist die sauberste Version davon, die ich finden konnte. Dies sollte die akzeptierte Antwort sein!
Schankam
4

Das ist ein regulärer Ausdruck, keine Zeichenfolge. Verwenden Sie den Konstruktor für ein RegExp-Objekt, um dynamisch einen regulären Ausdruck zu erstellen.

var r = new RegExp(stringToFind, 'g');
mystring.replace(r, 'some replacement text');
Alex Wayne
quelle
3

Versuchen:

var stringToFind = "test";
mystring = mystring.replace(new RegExp(stringToFind, "g"), mystring);
Halbmond frisch
quelle
Ich nehme an, das letzte "mystring" im Ersetzen ist nicht das, was Sie gemeint haben?
KooiInc
1

Dynamisches globales Ersetzen

Ich bin zu diesem Thread gekommen und habe nach einer etwas komplexeren Lösung gesucht, die hier nicht beantwortet wird. Ich habe jetzt die Antwort gefunden und werde sie veröffentlichen, falls jemand anderes sie nützlich findet.

Ich wollte eine dynamische globale Ersetzung durchführen, bei der die Ersetzungszeichenfolgen auf den ursprünglichen Übereinstimmungen basieren.

Zum Beispiel, um den ersten Buchstaben aller Wörter (z. B. "Katzensatmatte" in "Katzensatmatte") mit einem globalen Suchersatz groß zu schreiben. Hier erfahren Sie, wie das geht.

function capitaliseWords(aString) {
    // Global match for lowercase letters following a word boundary
    var letters = aString.match(/\b[a-z]/g), i, letterMatch;
    // Loop over all matched letters
    for( i = 0; i < letters.length; i++ ) {
        // Replace the matched letters with upper case versions
        letterMatch = new RegExp('\\b'+letters[i]); // EDIT - slight fix
        aString = aString.replace(letterMatch, letters[i].toUpperCase());
    }
    // Return our newly capitalised string
    return aString;
}

alert( capitaliseWords("cat sat mat") ); // Alerts "Cat Sat Mat"
Robin Winslow
quelle
0

Sie können dies mit der folgenden Methode tun

siehe diese Funktion:

function SetValue()
{
    var txt1='This is a blacK table with BLack pen with bLack lady';
    alert(txt1);
    var txt2= txt1.replace(/black/gi,'green');
    alert(txt2);
}

Syntax:

/ search_string / {g | gi}

wo

  • g ist ein globaler Ersatz, bei dem zwischen Groß- und Kleinschreibung unterschieden wird
  • gi ist ein blobaler Ersatz, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird

Sie können diesen JSBIN-Link überprüfen

http://jsbin.com/nohuroboxa/edit?html,js,output

Fahad
quelle