Cómo reemplazar todas las ocurrencias de una cadena

javascript string replace


Tengo esta cuerda:

"Test abc test test abc test test test abc test test abc"

Doing:

str = str.replace('abc', '');

parece que solo elimina la primera aparición de abc en la cadena anterior.

¿Cómo puedo reemplazar todas las ocurrencias?




Answer 1 Matthew Crumley


Nota: No use esto en el código crítico de rendimiento.

Como alternativa a las expresiones regulares para una simple cadena literal,podrías usar

str = "Test abc test test abc test...".split("abc").join("");

El patrón general es

str.split(search).join(replacement)

Esto solía ser más rápido en algunos casos que usar replaceAll y una expresión regular, pero ese ya no parece ser el caso en los navegadores modernos.

Punto de referencia: https://jsperf.com/replace-all-vs-split-join

Conclusión:Si tiene un caso de uso crítico de rendimiento (por ejemplo,el procesamiento de cientos de cadenas),utilice el método Regexp.Pero para la mayoría de los casos de uso típicos,vale la pena no tener que preocuparse por los caracteres especiales.




Answer 2 Sean Bright


str = str.replace(/abc/g, '');

En respuesta a los comentarios:

var find = 'abc';
var re = new RegExp(find, 'g');

str = str.replace(re, '');

En respuesta al comentario de Click Upvote , podría simplificarlo aún más:

function replaceAll(str, find, replace) {
  return str.replace(new RegExp(find, 'g'), replace);
}

Nota: Las expresiones regulares contienen caracteres especiales (meta) y, como tal, es peligroso pasar ciegamente un argumento en la función de find anterior sin procesarlo previamente para escapar de esos caracteres. Esto se trata en la red de desarrolladores de Mozilla 's Guía de JavaScript en las expresiones regulares , donde presentan la siguiente función de utilidad (que ha cambiado al menos dos veces desde esta respuesta fue escrito originalmente, así que asegúrese de comprobar el sitio MDN para las actualizaciones posibles):

function escapeRegExp(string) {
  return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

Entonces, para que la función replaceAll() anterior sea más segura, podría modificarse a lo siguiente si también incluye escapeRegExp :

function replaceAll(str, find, replace) {
  return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);
}



Answer 3 Cory Gross


Para completar,me puse a pensar en qué método debería usar para hacerlo.Hay básicamente dos maneras de hacer esto como sugieren las otras respuestas de esta página.

Nota: en general, no se recomienda ampliar los prototipos integrados en JavaScript. Estoy proporcionando extensiones en el prototipo de String simplemente con fines ilustrativos, mostrando diferentes implementaciones de un hipotético método estándar en el prototipo incorporado de String .


Aplicación basada en la expresión regular

String.prototype.replaceAll = function(search, replacement) {
    var target = this;
    return target.replace(new RegExp(search, 'g'), replacement);
};

Implementación de Split and Join (Funcional)

String.prototype.replaceAll = function(search, replacement) {
    var target = this;
    return target.split(search).join(replacement);
};

Sin saber demasiado sobre cómo funcionan las expresiones regulares entre bastidores en términos de eficiencia,tendí a inclinarme hacia la división y a unirme a la implementación en el pasado sin pensar en la actuación.Cuando me preguntaba qué era más eficiente,y por qué margen,lo usaba como excusa para averiguarlo.

En mi máquina Chrome con Windows 8, la implementación basada en expresiones regulares es la más rápida , con una implementación de división y unión un 53% más lenta . Lo que significa que las expresiones regulares son dos veces más rápidas para la entrada lorem ipsum que utilicé.

Echa un vistazo a este punto de referencia que ejecuta estas dos implementaciones entre sí.


Como se señala en el comentario a continuación de @ThomasLeduc y otros, podría haber un problema con la implementación basada en expresiones regulares si la search contiene ciertos caracteres que están reservados como caracteres especiales en expresiones regulares . La implementación asume que la persona que llama escapará de la cadena de antemano o solo pasará cadenas que no tengan los caracteres en la tabla en Expresiones regulares (MDN).

MDN también proporciona una implementación para escapar de nuestras cadenas. Sería bueno si esto también fuera estandarizado como RegExp.escape(str) , pero, por desgracia, no existe:

function escapeRegExp(str) {
  return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
}

Podríamos llamar a escapeRegExp dentro de nuestra implementación String.prototype.replaceAll , sin embargo, no estoy seguro de cuánto afectará esto al rendimiento (potencialmente incluso para cadenas para las que no se necesita el escape, como todas las cadenas alfanuméricas).




Answer 4 Adam A


El uso de una expresión regular con el conjunto de indicadores g reemplazará a todos:

someString = 'the cat looks like a cat';
anotherString = someString.replace(/cat/g, 'dog');
// anotherString now contains "the dog looks like a dog"

Vea aquí también




Answer 5 jesal


Aquí hay un prototipo de función de cadena basado en la respuesta aceptada:

String.prototype.replaceAll = function (find, replace) {
    var str = this;
    return str.replace(new RegExp(find, 'g'), replace);
};

EDIT

Si su find contendrá caracteres especiales, entonces necesita escapar de ellos:

String.prototype.replaceAll = function (find, replace) {
    var str = this;
    return str.replace(new RegExp(find.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'), replace);
};

Violín: http://jsfiddle.net/cdbzL/