大文字と小文字を区別しない置換機能の実装を探しています。たとえば、次のように機能するはずです。
'This iS IIS'.replaceAll('is', 'as');
結果は次のようになります。
'Thas as Ias'
何か案は?
更新:
変数と一緒に使用するとよいでしょう:
var searchStr = 'is';
'This iS IIS'.replaceAll(searchStr, 'as');
回答:
正規表現を試してください:
'This iS IIS'.replace(/is/ig, 'as');
例:
RegExpオブジェクトの使用:
var searchMask = "is";
var regEx = new RegExp(searchMask, "ig");
var replaceMask = "as";
var result = 'This iS IIS'.replace(regEx, replaceMask);
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'
正規表現ソリューションを使用する場合、置換文字列に「?」などが含まれていると問題が発生する可能性があります。したがって、すべての正規表現文字をエスケープするか、次の例を使用する必要があります。
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
大文字と小文字を区別する正規表現
: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));
正規表現を使用します。
'This iS IIS'.replace(/is/ig, 'as')
配列の文字列を置き換えるphp.jsのstr_ireplace関数をお勧めします。
.replace(searchMask, replaceMask)?