JavaScript replace / regex

Dada esta function:

function Repeater(template) { var repeater = { markup: template, replace: function(pattern, value) { this.markup = this.markup.replace(pattern, value); } }; return repeater; }; 

Como eu faço this.markup.replace() replace globalmente? Aqui está o problema. Se eu usá-lo assim:

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

O valor do alerta é “foobar $ TEST_ONE”.

Se eu alterar o Repeater para o seguinte, nada será substituído no Chrome:

 function Repeater(template) { var repeater = { markup: template, replace: function(pattern, value) { this.markup = this.markup.replace(new RegExp(pattern, "gm"), value); } }; return repeater; }; 

… e o alerta é $TEST_ONE $TEST_ONE .

Você precisa duplicar os caracteres RegExp (uma vez para a barra na string e uma vez para o regexp):

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

Caso contrário, procura o final da linha e ‘TESTONE’ (que nunca encontra).

Pessoalmente, eu não sou um grande fã de criar expressões regulares usando strings por esse motivo. O nível de fuga necessário pode levar você a beber. Tenho certeza de que os outros se sentem diferentes e gostam de beber quando escrevem regexes.

Em termos de interpretação de padrões, não há diferença entre as seguintes formas:

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

Se você quiser replace uma string literal usando o método replace , acho que você pode apenas passar uma string em vez de um regexp para replace .

Caso contrário, você teria que escaping de qualquer caractere especial de regexp no primeiro padrão – talvez assim:

 function reEscape(s) { return s.replace(/([.*+?^$|(){}\[\]])/mg, "\\$1"); } // ... var re = new RegExp(reEscape(pattern), "mg"); this.markup = this.markup.replace(re, value); 

Seu padrão de regex deve ter o modificador g:

 var pattern = /[somepattern]+/g; 

observe o g no final. ele diz ao substituto para fazer uma substituição global.

Além disso, você não precisa usar o object RegExp para construir seu padrão como acima. Exemplo padrão:

 var pattern = /[0-9a-zA-Z]+/g; 

um padrão é sempre cercado por / em ambos os lados – com modificadores após o final, sendo o modificador g o global.

EDIT: Por que importa se o padrão é uma variável? No seu caso, funcionaria assim (observe que o padrão ainda é uma variável):

 var pattern = /[0-9a-zA-Z]+/g; repeater.replace(pattern, "1234abc"); 

Mas você precisaria mudar sua function replace para isto:

 this.markup = this.markup.replace(pattern, value);