132 votes

JavaScript remplacer/regex

Compte tenu de cette fonction :

function Repeater(template) {

    var repeater = {

        markup: template,

        replace: function(pattern, value) {
            this.markup = this.markup.replace(pattern, value);
        }

    };

    return repeater;

};

Comment faire pour que this.markup.replace() l'échelle mondiale ? Voilà le problème. Si je l'utilise comme ceci :

alert(new Repeater("$TEST_ONE $TEST_ONE").replace("$TEST_ONE", "foobar").markup);

La valeur de l'alerte est "foobar $ TEST_ONE".

Si je change Repeater ce qui suit, alors rien dans remplacé dans Chrome :

function Repeater(template) {

    var repeater = {

        markup: template,

        replace: function(pattern, value) {
            this.markup = this.markup.replace(new RegExp(pattern, "gm"), value);
        }

    };

    return repeater;

};

...et l'alerte est $TEST_ONE $TEST_ONE.

165voto

seth Points 18409

Vous devez échapper deux fois tous les caractères RegExp (une fois pour la barre oblique dans la chaîne et une fois pour la regexp) :

  "$TESTONE $TESTONE".replace( new RegExp("\\$TESTONE","gm"),"foo")

Sinon, il cherche la fin de la ligne et 'TESTONE' (qu'il ne trouve jamais).

Personnellement, je ne suis pas un grand fan de construire des regexp en utilisant des cordes pour cette raison. Le niveau d'évasion qui est nécessaire pourrait vous amener à boire. Je suis sûr que les autres ressentent différemment et aiment boire quand ils écrivent des regex.

93voto

harto Points 28479

En termes d'interprétation des modèles, il n'y a pas de différence entre les formes suivantes :

  • /pattern/
  • new RegExp("pattern")

Si vous voulez remplacer une chaîne littérale en utilisant la méthode replace, je pense que vous pouvez simplement passer une chaîne au lieu d'une regexp à replace.

Sinon, vous devrez d'abord échapper à tous les caractères spéciaux regexp du modèle - peut-être comme ceci :

function reEscape(s) {
    return s.replace(/([.*+?^$|(){}\[\]])/mg, "\\$1");
}

// ...

var re = new RegExp(reEscape(pattern), "mg");
this.markup = this.markup.replace(re, value);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X