Con literales de cadena esto es bastante fácil.
¡Realmente no! El ejemplo solo reemplaza la primera aparición de string_to_replace
. Por lo general, desea reemplazar todas las ocurrencias, en cuyo caso, debe convertir la cadena en un Global ( /.../g
) RegExp. Puedes hacer esto desde una cadena usando el new RegExp
constructor:
new RegExp(string_to_replace, 'g')
El problema con esto es que cualquier carácter especial regex en el literal de cadena se comportará de manera especial en lugar de ser caracteres normales. Tendría que retroceder y escapar de ellos para arreglar eso. Desafortunadamente, no hay una función integrada para hacer esto por usted, así que aquí hay una que puede usar:
function escapeRegExp(s) {
return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
}
Tenga en cuenta también que cuando se utiliza una expresión regular en replace()
la cadena de reemplazo tiene ahora un carácter especial también $
. ¡Esto también se debe escapar si desea tener un literal $
en su texto de reemplazo!
function escapeSubstitute(s) {
return s.replace(/\$/g, '$$$$');
}
(Cuatro $
s porque eso es en sí mismo una cadena de reemplazo, ¡argh!)
Ahora puede implementar el reemplazo global de cadenas con RegExp:
function replace_foo(target, string_to_replace, replacement) {
var relit= escapeRegExp(string_to_replace);
var sub= escapeSubstitute(replacement);
var re= new RegExp(relit, 'g');
return target.replace(re, sub);
}
Que dolor. Afortunadamente, si todo lo que quiere hacer es reemplazar una cadena recta sin partes adicionales de expresiones regulares, hay una manera más rápida:
s.split(string_to_replace).join(replacement)
...y eso es todo. Este es un idioma comúnmente entendido.
decir que quiero reemplazar todo menos string_to_replace
¿Qué significa eso, desea reemplazar todos los tramos de texto que no participan en una coincidencia contra la cadena? Un reemplazo con ^
ciertamente no es esto, porque ^
significa un token de inicio de cadena, no una negación. ^
Es solo una negación en los []
grupos de personajes. También hay lookaheads negativos (?!...)
, pero hay problemas con eso en JScript, por lo que generalmente debe evitarlo.
Puede intentar hacer coincidir 'todo hasta' la cadena y usar una función para descartar cualquier tramo vacío entre cadenas coincidentes:
var re= new RegExp('(.*)($|'+escapeRegExp(string_to_find)+')')
return target.replace(re, function(match) {
return match[1]===''? match[2] : replacement+match[2];
});
Aquí, nuevamente, una división podría ser más simple:
var parts= target.split(string_to_match);
for (var i= parts.length; i-->0;)
if (parts[i]!=='')
parts[i]= replacement;
return parts.join(string_to_match);
/
delimitadores de expresiones regulares cuando use este formulario también.