대소 문자를 구분하지 않고 모두 교체


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)?
Sergey Metlov 2011 년

@DOTNET Ninja : 예제로 게시물을 업데이트했습니다.
Chandu 2011 년

내가 두 번째 코드 샘플 있다는 사실에 무슨 일이 일어나고 있는지 설명 할 수 있다면 나는 두 upvotes을 줘야 할 것
크리스 Marisic

8
경고 :이 대답은 정규식 의미를 가진 문자가있을 때 엉망이됩니다. 올바른 접근 방식은 Benjamin Fleming의 답변을 참조하십시오.
FlorianB 2017-04-22

정말 고마워요 친구! 나는 문자열로 직접 시도하고 있었다.
Saurabh Prajapati

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-04-22

다음과 같은 경우도 처리 할 수 ​​있습니다. 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의 대답에서 즉석에서 나온 것이며 Regex와 Non-regex 사이에 성능 차이가 있습니다.

비교를위한 정규식 코드는 Benjamin Fleming의 답변입니다.

JSPerf
대소 문자 구분
Regex : 66,542 Operations / sec
Non-Regex : 178,636 Operations / sec (split-join)


대소 문자 구분 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));



-2

배열의 문자열을 대체하는 php.js 의 str_ireplace 함수를 권장합니다 .


2
이러한 간단한 작업에 타사 라이브러리를 사용하는 것은 과도 할 수 있습니다.
Balázs Vincze
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.