web-dev-qa-db-fra.com

En Javascript, comment puis-je effectuer un remplacement global sur une chaîne avec une variable entre '/' et '/ g'?

Je souhaite effectuer un remplacement global de chaîne à l'aide de String.replace en Javascript.

Dans la documentation, j'ai lu que je pouvais le faire avec/g, c'est-à-dire par exemple;

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

et cela remplacera toutes les occurrences dans le mystère. Pas de guillemets pour l'expression.

Mais si j'ai une variable à trouver, comment puis-je le faire sans guillemets?

J'ai essayé quelque chose comme ça:

var stringToFind = "test";

//premier essai

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

// deuxième essai, pas beaucoup de sens du tout

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

mais ils ne travaillent pas. Des idées?

58
avastreg
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"

Si vous en avez besoin dans une fonction

  replaceGlobally(original, searchTxt, replaceTxt) {
    const regex = new RegExp(searchTxt, 'g');
    return original.replace(regex, replaceTxt) ;
  }
175
Paolo Bergantino

Pour regex, new RegExp(stringtofind, 'g');. MAIS. Si "find" contient des caractères spéciaux dans regex, ils auront leur signification regexy. Donc, si vous essayez de remplacer le "." dans 'abc.def' avec 'x', vous obtiendrez 'xxxxxxx' - whoops.

Si tout ce que vous voulez, c'est un simple remplacement de chaîne, vous n'avez pas besoin d'expressions régulières! Voici la chaîne simple remplace l'idiome:

mystring= mystring.split(stringtofind).join(replacementstring);
65
bobince

Les expressions régulières sont beaucoup plus lentes que la recherche par chaîne. Donc, créer un regex avec une chaîne de recherche échappée n'est pas une méthode optimale. Même en boucle, la chaîne serait plus rapide, mais je suggère d'utiliser des méthodes pré-compilées intégrées.

Voici un moyen rapide et propre de remplacer rapidement une chaîne globale:

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

Et c'est tout.

35
Lex
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);

post silmiar

14
unigogo

C'est une expression régulière, pas une chaîne. Utilisez le constructeur d'un objet RegExp pour créer dynamiquement une expression régulière.

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

Essayer:

var stringToFind = "test";
mystring = mystring.replace(new RegExp(stringToFind, "g"), mystring);
2
Crescent Fresh

Vous pouvez utiliser la solution suivante pour effectuer un remplacement global sur une chaîne avec une variable entre '/' et '/ g':

myString.replace(new RegExp(strFind, 'g'), strReplace);
2
dSd

Dynamique global remplacer

Je suis venu à ce fil à la recherche d'une solution légèrement plus complexe à laquelle on ne répond pas ici. J'ai maintenant trouvé la réponse, je vais donc la poster au cas où quelqu'un le trouverait utile.

Je voulais faire un remplacement global dynamique, où les chaînes de remplacement sont basées sur les correspondances d'origine.

Par exemple, pour capitaliser la première lettre de tous les mots (par exemple, "cat sat mat" dans "Cat Sat Mat") avec une substitution globale. Voici comment faire ça.

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"
1
Robin Winslow

Si vous voulez interpoler les variables, vous devez utiliser l'objet RegExp

https://developer.mozilla.org/fr/Core_JavaScript_1.5_Guide/Regular_Expressions

Exemple:

var str = "This is my name";
var replace = "i";
var re = new RegExp(replace, 'g')    

str = str.replace(re, 'p');
alert(str);
1
Philip Reynolds

Vous pouvez faire en utilisant la méthode suivante

voir cette fonction:

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);
}

syntaxe:

/ chaîne_recherche/{g | gi}

où 

  • g est un remplacement global sensible à la casse 
  • gi est un remplacement blobal insensible à la casse

Vous pouvez vérifier ce lien JSBIN 

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

0
Fahad