regulares - JavaScript replace/regex
replace multiple javascript (3)
En términos de interpretación de patrones, no hay diferencia entre las siguientes formas:
-
/pattern/
-
new RegExp("pattern")
Si desea reemplazar una cadena literal utilizando el método de replace
, creo que puede pasar una cadena en lugar de una expresión regular para replace
.
De lo contrario, primero tendría que escapar de los caracteres especiales de expresiones regulares en el patrón, 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);
Dada esta función:
function Repeater(template) {
var repeater = {
markup: template,
replace: function(pattern, value) {
this.markup = this.markup.replace(pattern, value);
}
};
return repeater;
};
¿Cómo puedo hacer que this.markup.replace()
reemplace globalmente? 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 lo siguiente, entonces no se reemplaza nada 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 es $TEST_ONE $TEST_ONE
.
Necesita duplicar los caracteres RegExp (una vez para la barra en la cadena y una para la expresión regular):
"$TESTONE $TESTONE".replace( new RegExp("//$TESTONE","gm"),"foo")
De lo contrario, busca el final de la línea y ''TESTONE'' (que nunca encuentra).
Personalmente, no soy un gran fan de la construcción de regexp usando cadenas por esta razón. 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.
Su patrón de expresiones regulares debe tener el modificador g:
var pattern = /[somepattern]+/g;
nota la g al final. le dice al sustituto que haga un reemplazo global.
Además, no necesita usar el objeto RegExp para construir su patrón como se indicó anteriormente. Patrón de ejemplo:
var pattern = /[0-9a-zA-Z]+/g;
un patrón siempre está rodeado por / en cada lado - con modificadores después del / final, siendo el modificador g el global.
EDITAR: ¿Por qué importa si el patrón es una variable? En su caso, funcionaría así (observe que el patrón sigue siendo una variable):
var pattern = /[0-9a-zA-Z]+/g;
repeater.replace(pattern, "1234abc");
Pero necesitarías cambiar tu función de reemplazo a esto:
this.markup = this.markup.replace(pattern, value);