Groß- und Kleinschreibung beachten Alle ersetzen

83

Ich suche nach einer Implementierung der Funktion zum Ersetzen ohne Berücksichtigung der Groß- und Kleinschreibung. Zum Beispiel sollte es so funktionieren:

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

und Ergebnis sollte sein:

'Thas as Ias'

Irgendwelche Ideen?

AKTUALISIEREN:

Es wäre toll, es mit Variable zu verwenden:

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

Antworten:

143

Versuchen Sie es mit Regex:

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

Arbeitsbeispiel: http://jsfiddle.net/9xAse/

Beispiel:
Verwenden des RegExp-Objekts:

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

var result = 'This iS IIS'.replace(regEx, replaceMask);
Chandu
quelle
2
Großartig! Aber wie benutzt man stattdessen eine Variable? .replace(searchMask, replaceMask)?
Sergey Metlov
@DOTNET Ninja: Der Beitrag wurde mit einem Beispiel aktualisiert.
Chandu
Ich würde zwei Gegenstimmen geben, wenn ich für das zweite Codebeispiel könnte, das tatsächlich erklärt, was los ist
Chris Marisic
7
WARNUNG: Diese Antwort führt zu einem Durcheinander, wenn ein Zeichen eine Regex-Bedeutung hat. Siehe Antwort von Benjamin Fleming für den richtigen Ansatz.
FlorianB
Vielen Dank Kumpel! Ich habe es direkt in der Schnur versucht.
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);
};

Dies implementiert genau das Beispiel, das Sie bereitgestellt haben.

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

Kehrt zurück

'Thas as Ias'
Ben Fleming
quelle
1
Dies ist in der Tat die richtige Lösung. Die Antwort von Chandu wird ein Chaos verursachen, wenn es einen Charakter gibt, der eine Regex-Bedeutung hat.
FlorianB
Dies kann auch Fälle behandeln wie: txt.replaceAll ("(test12)", "")
user1400290
Mit Abstand beste Lösung. Arbeitet ein Vergnügen. Danke Ben.
Ste
8

Wenn Sie die Regex-Lösung verwenden, können Probleme auftreten, wenn Ihre Ersetzungszeichenfolge z. B. "?" Enthält. Sie müssen also alle Regex-Zeichen umgehen oder z.

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);
};

Dies ändert nicht alle Vorkommen von 'is' in der Zeichenfolge. Daher können Sie eine while-Schleife in die Funktion schreiben.

Paul
quelle
Dies ist auch doppelt so schnell wie die Regexp-Lösung. Siehe jsperf.com/replace-all-case-insenstive/1
kofifus
1
Dies ersetzt nur einmal
StefansArya
4

Dies ist die Improvisation aus Pauls Antwort, und es gibt eine Leistungslücke zwischen Regex und Non-Regex

Der Regex-Code zum Vergleich ist die Antwort von Benjamin Fleming.

JSPerf Groß-
und Kleinschreibung
beachten Regex: 66.542 Operationen / Sek.
Nicht-Regex: 178.636 Operationen / Sek. (Split - Join)

Incase-sensitive
Regex: 37.837 Operationen / Sek.
Nicht-Regex: 12.566 Operationen / Sek. (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
quelle
1

Verwenden Sie einen regulären Ausdruck.

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

Ich empfehle die Funktion str_ireplace aus php.js, die sogar Zeichenfolgen aus Arrays ersetzt.

andreszs
quelle
2
Die Verwendung einer Bibliothek eines Drittanbieters für solch einfache Aufgaben kann übertrieben sein.
Balázs Vincze