Замінити все без регістру


83

Я шукаю будь-яку реалізацію функції заміщення, що не враховує регістр. Наприклад, це повинно працювати так:

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

і результат повинен бути:

'Thas as Ias'

Будь-які ідеї?

ОНОВЛЕННЯ:

Було б чудово використовувати його зі змінною:

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

Відповіді:


144

Спробуйте регулярний вираз:

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

Робочий приклад: http://jsfiddle.net/9xAse/

наприклад:
Використання об'єкта RegExp:

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

var result = 'This iS IIS'.replace(regEx, replaceMask);

2
Чудово! Але як замість цього використовувати змінну? .replace(searchMask, replaceMask)?
Сергій Метлов

@DOTNET Ninja: Оновив публікацію на прикладі.
Chandu

Я б дав два голоси за, якщо б міг за другий зразок коду, який насправді пояснює, що відбувається
Кріс Марісіч

8
ПОПЕРЕДЖЕННЯ: Ця відповідь зробить хаос, коли є персонаж, що має значення регулярного виразу. Дивіться відповідь Бенджаміна Флемінга щодо правильного підходу.
FlorianB

Велике спасибі приятелю! Я намагався прямо в рядку.
Saurabh Prajapati

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

Це реалізує саме той приклад, який ви надали.

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

Повернення

'Thas as Ias'

1
Це справді правильне рішення. Відповідь Чанду зробить безлад, коли є персонаж, що має значення регулярного виразу.
FlorianB

Це також може обробляти такі випадки, як: txt.replaceAll ("(test12)", "")
user1400290

На сьогодні найкраще рішення. Працює ласощі. Дякую Бен.
Ste

8

Коли ви використовуєте рішення регулярного виразу, ви можете отримати проблеми, якщо рядок заміни містить, наприклад, "?". Отже, вам потрібно уникнути всіх символів регулярних виразів або використовувати, наприклад:

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

це не змінить усіх випадків 'є' у рядку. Тому ви можете написати цикл while у функції.


Це також вдвічі швидше, ніж рішення regexp .. див. Jsperf.com/replace-all-case-insenstive/1
kofifus

1
Це лише одна заміна
StefansArya 24.03.18

4

Це імпровізація з відповіді Пола, і існує різниця в продуктивності між регулярними та нерегексними виразами

Код регулярного виразу для порівняння взято у відповіді Бенджаміна Флемінга.

Регулярний вираз JSPerf,
чутливий до регістру
: 66 542 операцій / с
Нерегекс: 178 636 операцій / с (розділити - приєднати)


Регулярний вираз, чутливий до регістру : 37837 операцій / с Нерегексний
вираз: 12 566 операцій / с

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



-2

Я рекомендую функцію str_ireplace з php.js, яка навіть замінює рядки з масивів.


2
Використання сторонньої бібліотеки для такого простого завдання може бути надмірним.
Balázs Vincze
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.