不区分大小写全部替换


81

我正在寻找不区分大小写的替换功能的任何实现。例如,它应该像这样工作:

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

结果应该是:

'Thas as Ias'

有任何想法吗?

更新:

最好将它与变量一起使用:

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

Answers:


141

试试正则表达式:

'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

如果能为第二个代码示例提供实际的解释,我将给予两次投票
Chris Marisic '16

7
警告:当某个字符具有正则表达式含义时,此答案将变得一团糟。有关正确的方法,请参见本杰明·弗莱明(Benjamin Fleming)的回答。
FlorianB

非常感谢你的朋友!我直接在字符串中尝试。
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);
};

这完全实现了您提供的示例。

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

退货

'Thas as Ias'

1
这确实是正确的解决方案。当有一个具有正则表达式含义的字符时,Chandu的回答将变得一团糟。
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);
};

这不会更改字符串中所有出现的“ is”。因此,您可以在函数中编写while循环。


这也是两倍于正则表达式的解决方案快..看到jsperf.com/replace-all-case-insenstive/1
kofifus

1
这仅一次替换
StefansArya

4

这是Paul回答的即兴表现,正则表达式与非正则表达式之间存在性能差距

本杰明·弗雷明(Benjamin Fleming)的答案是用于比较的正则表达式代码。

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



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.