2009-07-22 49 views
72

Teniendo en cuenta esta función:JavaScript reemplazar/expresiones regulares

function Repeater(template) { 

    var repeater = { 

     markup: template, 

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

    }; 

    return repeater; 

}; 

¿Cómo hago this.markup.replace() reemplazar a nivel mundial? Este es el problema. Si lo uso así:

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

El valor de la alerta es "foobar $ TEST_ONE".

Si cambio Repeater a la siguiente, entonces nada en reemplazados en Chrome:

function Repeater(template) { 

    var repeater = { 

     markup: template, 

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

    }; 

    return repeater; 

}; 

... y la alerta se $TEST_ONE $TEST_ONE.

Respuesta

102

Usted necesidad de duplicar escapar ningún carácter RegExp (una vez por la barra de la cadena y una vez para la expresión regular):

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

De lo contrario, se busca el final de la línea y 'TESTONE' (que nunca lo encuentra).

Personalmente, no soy un gran fan de la construcción de regexp usando cadenas por este motivo. El nivel de escape que se necesita puede llevarlo a beber. Estoy seguro de que otros se sienten diferentes y les gusta beber cuando escriben expresiones regulares.

+0

pero reemplace() recibe la expresión regular como una variable. – core

+0

Corrección secundaria: '$' denota fin de línea en una expresión regular. – harto

+6

@Chris - No creo que marque la diferencia si usas '/ pattern /' o 'nuevo RegExp (" patrón ")'. – harto

21

Su patrón de expresión debe tener el modificador g:

var pattern = /[somepattern]+/g; 

aviso de la g al final. le dice al sustituto que haga un reemplazo global.

Además, no necesita utilizar el objeto RegExp para construir su patrón como se indica anteriormente. patrón Ejemplo:

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

un patrón siempre está rodeado de/a cada lado - con modificadores después de la, el modificador final/g siendo la global.

EDITAR: ¿Por qué es importante si el patrón es una variable? En el caso de que funcionaría como esto (nota que el patrón sigue siendo una variable):

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

Pero usted tendría que cambiar su reemplazar la función a esto:

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

en términos de interpretación patrón, no hay diferencia entre las siguientes formas:

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

Si desea reemplazar una cadena literal utilizando el método replace, creo que sólo puede pasar una cadena en lugar de una expresión regular a replace.

De lo contrario, tendría que escapar caracteres especiales de expresiones regulares en el patrón de primera - tal vez así:

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

// ... 

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

No sabía antes, ese/patrón/es lo mismo que el nuevo RegExp ("patrón"). ¡Realmente ayudado! –

+1

¿Alguna razón para no usar una lista blanca en lugar de una lista negra? por ejemplo: s.replace (/ (\ W)/g, '\\ $ 1') –

+1

El primer formulario enumerado es mejor. Es una buena práctica evitar la _new_ palabra clave. – Druska

Cuestiones relacionadas