No distingue entre mayúsculas y minúsculas reemplazar todo

81

Estoy buscando cualquier implementación de función de reemplazo que no distinga entre mayúsculas y minúsculas. Por ejemplo, debería funcionar así:

'This iS IIS'.replaceAll('is', 'as');

y el resultado debe ser:

'Thas as Ias'

¿Algunas ideas?

ACTUALIZAR:

Sería genial usarlo con variable:

var searchStr = 'is';
'This iS IIS'.replaceAll(searchStr, 'as');
Sergey Metlov
fuente

Respuestas:

141

Prueba regex:

'This iS IIS'.replace(/is/ig, 'as');

Ejemplo de trabajo: http://jsfiddle.net/9xAse/

por ejemplo:
Usando el objeto RegExp:

var searchMask = "is";
var regEx = new RegExp(searchMask, "ig");
var replaceMask = "as";

var result = 'This iS IIS'.replace(regEx, replaceMask);
Chandu
fuente
2
¡Excelente! Pero, ¿cómo usar la variable en su lugar? .replace(searchMask, replaceMask)?
Sergey Metlov
@DOTNET Ninja: actualizó la publicación con un ejemplo.
Chandu
Daría dos votos a favor si pudiera por la segunda muestra de código que realmente explica lo que está sucediendo
Chris Marisic
7
ADVERTENCIA: Esta respuesta hará un lío cuando haya un carácter que tenga un significado de expresión regular. Consulte la respuesta de Benjamin Fleming para conocer el enfoque correcto.
FlorianB
¡Muchas gracias amigo! Estaba intentando directamente en una cuerda.
Saurabh Prajapati
54
String.prototype.replaceAll = function(strReplace, strWith) {
    // See http://stackoverflow.com/a/3561711/556609
    var esc = strReplace.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
    var reg = new RegExp(esc, 'ig');
    return this.replace(reg, strWith);
};

Esto implementa exactamente el ejemplo que proporcionó.

'This iS IIS'.replaceAll('is', 'as');

Devoluciones

'Thas as Ias'
Ben Fleming
fuente
1
De hecho, esta es la solución correcta. La respuesta de Chandu hará un lío cuando haya un carácter que tenga un significado de expresión regular.
FlorianB
Esto también puede manejar casos como: txt.replaceAll ("(test12)", "")
user1400290
La mejor solución con diferencia. Funciona de maravilla. Gracias Ben.
Ste
8

Cuando usa la solución de expresiones regulares, puede tener problemas si su cadena de reemplazo contiene, por ejemplo, "?". Por lo tanto, debe escapar de todos los caracteres regex o usar, por ejemplo:

String.replacei = String.prototype.replacei = function (rep, rby) {
    var pos = this.toLowerCase().indexOf(rep.toLowerCase());
    return pos == -1 ? this : this.substr(0, pos) + rby + this.substr(pos + rep.length);
};

esto no cambiará todas las apariciones de 'is' en la cadena. Por lo tanto, puede escribir un bucle while en la función.

Paul
fuente
Esto también es el doble de rápido que la solución regexp .. ver jsperf.com/replace-all-case-insenstive/1
kofifus
1
Esto solo reemplaza una vez
StefansArya
4

Esta es la improvisación de la respuesta de Paul, y hay una brecha de rendimiento entre Regex vs Non-regex

El código de expresiones regulares para la comparación se toma la respuesta de Benjamin Fleming.

JSPerf Regex
sensible a
mayúsculas y minúsculas : 66,542 operaciones / s
No Regex: 178,636 operaciones / s (división - unión)


Regex sensible a mayúsculas y minúsculas : 37,837 operaciones / s
No Regex: 12,566 operaciones / s (indexOf - substr)

String.prototype.replaces = function(str, replace, incaseSensitive) {
    if(!incaseSensitive){
        return this.split(str).join(replace);
    } else { 
        // Replace this part with regex for more performance

        var strLower = this.toLowerCase();
        var findLower = String(str).toLowerCase();
        var strTemp = this.toString();

        var pos = strLower.length;
        while((pos = strLower.lastIndexOf(findLower, pos)) != -1){
            strTemp = strTemp.substr(0, pos) + replace + strTemp.substr(pos + findLower.length);
            pos--;
        }
        return strTemp;
    }
};

// Example
var text = "A Quick Dog Jumps Over The Lazy Dog";
console.log(text.replaces("dog", "Cat", true));

StefansArya
fuente
1

Usa una expresión regular.

'This iS IIS'.replace(/is/ig, 'as')
Daniel A. White
fuente
-2

Recomiendo la función str_ireplace de php.js, que incluso reemplaza cadenas de matrices.

andreszs
fuente
2
Usar una biblioteca de terceros para una tarea tan simple puede ser excesivo.
Balázs Vincze