大文字と小文字を区別しないすべてを置き換える


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)
セルゲイメトロフ2011

@DOTNET Ninja:投稿を例で更新しました。
チャンドゥ2011

何が起こっているのかを実際に説明する2番目のコードサンプルにできれば、2つの賛成票を投じます
Chris Marisic 2016

8
警告:正規表現の意味を持つキャラクターがいる場合、この回答は混乱します。正しいアプローチについては、ベンジャミンフレミングの回答を参照してください。
FlorianB 2017

どうもありがとうございました!私は文字列で直接試していました。
SaurabhPrajapati20年

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
これは確かに正しい解決策です。正規表現の意味を持つキャラクターがいると、Chanduによる回答が混乱します。
FlorianB 2017

これは、次のような場合も処理できます:txt.replaceAll( "(test12)"、 "")
user1400290 2018

断然最良の解決策。御馳走を動作します。ベンに感謝します。
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);
};

これは、文字列内の「is」のすべての出現を変更するわけではありません。したがって、関数にwhileループを書くことができます。


これは、正規表現ソリューションの2倍の速度でもあります。jsperf.com/ replace
all

1
これは1回だけ交換します
StefansArya 2018年

4

これはポールの答えからの即興演奏であり、正規表現と非正規表現の間にパフォーマンスのギャップがあります

比較のための正規表現コードは、ベンジャミンフレミングの答えです。

JSPerf
大文字と小文字を区別する正規表現
:66,542操作/秒
非正規表現:178,636操作/秒(分割-結合)


大文字と小文字を区別する正規表現:37,837操作/秒
非正規表現:12,566操作/秒(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));



-2

配列の文字列を置き換えるphp.jsのstr_ireplace関数をお勧めします。


2
このような単純なタスクにサードパーティのライブラリを使用するのはやり過ぎかもしれません。
バラージュVincze
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.