Wymień wszystko bez rozróżniania wielkości liter

83

Szukam dowolnej implementacji funkcji zastępowania bez uwzględniania wielkości liter. Na przykład powinno działać tak:

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

a wynik powinien być:

'Thas as Ias'

Jakieś pomysły?

AKTUALIZACJA:

Byłoby wspaniale użyć go ze zmienną:

var searchStr = 'is';
'This iS IIS'.replaceAll(searchStr, 'as');
Siergiej Metłow
źródło

Odpowiedzi:

144

Wypróbuj wyrażenie regularne:

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

Przykład roboczy: http://jsfiddle.net/9xAse/

np.
przy użyciu obiektu RegExp:

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

var result = 'This iS IIS'.replace(regEx, replaceMask);
Chandu
źródło
2
Świetny! Ale jak zamiast tego użyć zmiennej? .replace(searchMask, replaceMask)?
Sergey Metlov
@DOTNET Ninja: Zaktualizowałem post z przykładem.
Chandu,
Dałbym dwa głosy za, gdybym mógł, za drugą próbkę kodu, która faktycznie wyjaśnia, co się dzieje
Chris Marisic
7
OSTRZEŻENIE: Ta odpowiedź zrobi bałagan, gdy pojawi się znak, który ma znaczenie wyrażenia regularnego. Zobacz odpowiedź Benjamina Fleminga, aby poznać prawidłowe podejście.
FlorianB
Dziękuję bardzo kolego! Próbowałem bezpośrednio w sznurku.
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);
};

To implementuje dokładnie podany przykład.

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

Zwroty

'Thas as Ias'
Ben Fleming
źródło
1
To jest rzeczywiście właściwe rozwiązanie. Odpowiedź Chandu zrobi bałagan, gdy pojawi się znak, który ma znaczenie wyrażenia regularnego.
FlorianB
Może to również obsługiwać przypadki takie jak: txt.replaceAll ("(test12)", "")
user1400290
Zdecydowanie najlepsze rozwiązanie. Działa wspaniale. Dzięki Ben.
Ste
8

Kiedy używasz rozwiązania regex, możesz mieć problemy, jeśli twój ciąg zastępujący zawiera np. „?”. Musisz więc uciec przed wszystkimi znakami regex lub użyć np:

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

nie zmieni to wszystkich wystąpień „jest” w ciągu. Dlatego możesz napisać pętlę while w funkcji.

Paweł
źródło
Jest to również dwukrotnie szybsze niż rozwiązanie regexp. Patrz jsperf.com/replace-all-case-insenstive/1
kofifus.
1
To zastępuje tylko jeden raz
StefansArya
4

To jest improwizacja z odpowiedzi Paula i istnieje różnica w wydajności między Regex a Non-regex

Kod wyrażenia regularnego do porównania pochodzi z odpowiedzi Benjamina Fleminga.

JSPerf Z uwzględnieniem wielkości
liter
Regex: 66,542 Operacje / s
Non-Regex: 178636 Operations / sec (split - join)


Regex wrażliwy na incydenty: 37 837 operacji / s
Non-regex: 12566 operacji / 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
źródło
1

Użyj wyrażenia regularnego.

'This iS IIS'.replace(/is/ig, 'as')
Daniel A. White
źródło
-2

Polecam funkcję str_ireplace z php.js, która zastępuje nawet ciągi znaków z tablic.

andreszs
źródło
2
Używanie biblioteki innej firmy do tak prostego zadania może być przesadą.
Balázs Vincze