2011-09-05 136 views
31

我在尋找不區分大小寫的替換函數的任何實現。例如,它應該像這樣工作:不區分大小寫全部替換

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

和結果應該是:

'Thas as Ias' 

任何想法?
在此先感謝。

UPDATE:
這將是巨大的,具有可變使用它:

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

回答

70

嘗試正則表達式:

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

工作實施例:http://jsfiddle.net/9xAse/

e.g:
使用RegExp對象:

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

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

太棒了!但是如何使用變量呢? '.replace(searchMask,replaceMask)'? –

+0

@DOTNET忍者:用示例更新了帖子。 – Chandu

+0

我會給兩個upvotes,如果我能爲第二個代碼示例,實際上解釋發生了什麼 –

1

使用正則表達式。

'This iS IIS'.replace(/is/ig, 'as') 
19
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' 
+0

編輯:忘記'返回'! –

+0

這確實是正確的解決方案。當有一個具有正則表達意義的角色時,Chandu將會弄得一團糟。 – FlorianB

6

當您使用正則表達式的解決方案,你可以得到的問題,如果您的替換字符串包含例如「?」。所以,你必須逃避所有正則表達式的字符或使用例如爲:

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循環。

+0

這也比正則表達式解決方案快一倍。請參閱https://jsperf.com/replace-all-case-insenstive/1 – kofifus