122

I am looking for any implementation of case insensitive replacing function. For example, it should work like this:

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

and result should be:

'Thas as Ias'

Any ideas?

UPDATE:

It would be great to use it with variable:

var searchStr = 'is';
'This iS IIS'.replaceAll(searchStr, 'as');
Uwe Keim
  • 39,551
  • 56
  • 175
  • 291
Sergey Metlov
  • 25,747
  • 28
  • 93
  • 153

8 Answers8

204

Try regex:

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

Working Example: http://jsfiddle.net/9xAse/

e.g:
Using RegExp object:

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

var result = 'This iS IIS'.replace(regEx, replaceMask);
Chandu
  • 81,493
  • 19
  • 133
  • 134
77
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 implements exactly the example you provided.

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

Returns

'Thas as Ias'
Ben
  • 5,117
  • 2
  • 27
  • 26
12

When you use the regex solution you can get problems if your replace string contain e.g. "?". So you have to escape all regex characters or use e.g.:

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

this will not change all the occurrences of 'is' in the string. Therefore you can write a while loop in the function.

Paul
  • 678
  • 10
  • 15
5

This is the improvisation from Paul's answer, and there are a performance gap between Regex vs Non-regex

The regex code for comparation is taken Benjamin Fleming's answer..

JSPerf
Case-sensitive
Regex: 66,542 Operations/sec
Non-Regex: 178,636 Operations/sec (split - join)

Incase-sensitive
Regex: 37,837 Operations/sec
Non-Regex: 12,566 Operations/sec (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
  • 2,802
  • 3
  • 24
  • 25
  • Warning: this leads to an infinite loop in case the `str` string is at the very start of the input string. – Evariste Jan 16 '23 at 12:00
  • Looks like someone already posted the one line fix as a new answer below, actually I will happily accept edit from community to my answer instead – StefansArya Jan 18 '23 at 07:28
2

Note there is a bug in an answer provided above. If your original string starts with the replacement you'll enter an infinite loop.

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);
            if (pos == 0) break; // Fixes bug
            pos--;
        }
        return strTemp;
    }
};

// Example
var text = "Dog Jumps Over The Lazy Dog";
console.log(text.replaces("dog", "Cat", true));
2

Use a regular expression.

'This iS IIS'.replace(/is/ig, 'as')
Daniel A. White
  • 187,200
  • 47
  • 362
  • 445
0

Insensitive ReplaceAll: 12 053 033 replaces by 1 sec
for ReplaceAll("Dog Jumps Over The Lazy Dog", "dog", "Cat")

Example:

function ReplaceAll(base,told,tnew) { // replace insensitive
  if (told=="") {return base;}
  var u=base.toLowerCase();
  var t=told.toLowerCase();
  var ss=""; var p=-1; var i=0;
  p=u.indexOf(t);
  if (p>-1) {
    let mLen=told.length;
    while (p>=0) {
      ss+=base.substr(0,p)+tnew;
      i=p+mLen;
      base=base.substr(i);
      u=u.substr(i);
      p=u.indexOf(t);
    }
    ss+=base; //fix bug
    return ss;
  }
  return base;
}    
/*Test:
    
    function loopThrough() {
             for (let i = 0; i < 60000000; i++) {
               let s=ReplaceAll("Dog Jumps Over The Lazy Dog","dog","Cat");
             }
          }
    
    $(document).ready(function(){
      $("button").click(function(){
          //alert(ReplaceAll("Dog Jumps Over The Lazy Dog","dog", "Cat"));
          
          document.getElementById("demo").innerHTML = '...';
          let startTime = new Date();
          loopThrough();
          let endTime = new Date();
          let timeElapsed = endTime - startTime;
          document.getElementById("demo").innerHTML =  "elapsed times: " + timeElapsed + " milliseconds.";
*/
Jan Tungli
  • 35
  • 6
-2

I recommend the str_ireplace function from php.js, which even replaces strings from arrays.

andreszs
  • 2,896
  • 3
  • 26
  • 34