모든 문자열을 바꾸는 방법

javascript string replace


이 문자열이 있습니다.

"Test abc test test abc test test test abc test test abc"

Doing:

str = str.replace('abc', '');

위의 문자열에서 abc 의 첫 번째 항목 만 제거하는 것 같습니다 .

모든 발생을 어떻게 교체 할 수 있습니까?




Answer 1 Matthew Crumley


참고 : 성능이 중요한 코드에는이 코드를 사용하지 마십시오.

간단한 리터럴 문자열에 대한 정규식의 대안으로 다음을 사용할 수 있습니다.

str = "Test abc test test abc test...".split("abc").join("");

일반적인 패턴은

str.split(search).join(replacement)

이것은 replaceAll 과 정규 표현식을 사용하는 것보다 더 빠른 경우가 있었지만 현대 브라우저에서는 더 이상 그렇지 않습니다.

벤치 마크 : https://jsperf.com/replace-all-vs-split-join

결론 : 성능이 중요한 사용 사례 (예 : 수백 개의 문자열 처리)가있는 경우 Regexp 메서드를 사용하십시오. 그러나 가장 일반적인 사용 사례의 경우 특수 문자에 대해 걱정할 필요가 없습니다.




Answer 2 Sean Bright


str = str.replace(/abc/g, '');

의견에 대한 답변 :

var find = 'abc';
var re = new RegExp(find, 'g');

str = str.replace(re, '');

Click Upvote 의 의견에 대한 답변으로 더 많은 것을 단순화 할 수 있습니다.

function replaceAll(str, find, replace) {
  return str.replace(new RegExp(find, 'g'), replace);
}

참고 : 정규식에는 특수 (메타) 문자가 포함되어 있으므로 위 문자를 이스케이프 처리하기 위해 사전 처리하지 않고 find 함수 에서 인수를 맹목적으로 전달하는 것은 위험합니다 . 이것은 정규식 에 대한 Mozilla 개발자 네트워크 의 JavaScript 안내서에서 다루며 , 여기에는 다음과 같은 유틸리티 기능이 있습니다 (이 답변이 처음 작성된 이후 최소한 두 번 변경되었으므로 잠재적 인 업데이트가 있는지 MDN 사이트를 확인하십시오).

function escapeRegExp(string) {
  return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

그래서 만들기 위해 replaceAll() 당신은 또한 포함 할 경우 안전 위의 함수를, 그것은 다음에 수정할 수 escapeRegExp 를 :

function replaceAll(str, find, replace) {
  return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);
}



Answer 3 Cory Gross


완벽을 기하기 위해 어떤 방법을 사용해야하는지 생각해야했습니다. 이 페이지의 다른 답변에서 제안한대로 기본적으로 두 가지 방법이 있습니다.

참고 : 일반적으로 JavaScript로 내장 프로토 타입을 확장하는 것은 권장되지 않습니다. String 내장 프로토 타입 에 대한 가상 표준 방법의 다양한 구현을 보여주기 위해 단순히 예시 목적으로 String 프로토 타입에 대한 확장을 제공하고 있습니다 .


정규식 기반 구현

String.prototype.replaceAll = function(search, replacement) {
    var target = this;
    return target.replace(new RegExp(search, 'g'), replacement);
};

분할 및 결합 (기능) 구현

String.prototype.replaceAll = function(search, replacement) {
    var target = this;
    return target.split(search).join(replacement);
};

효율성 측면에서 정규 표현식이이면에서 어떻게 작동하는지에 대해 너무 많이 알지 못했지만 성능에 대해 생각하지 않고 과거에 분할 및 구현에 의존하는 경향이있었습니다. 어느 것이 더 효율적이고 어떤 마진으로 궁금해했을 때 나는 그것을 핑계로 사용했습니다.

내 크롬 윈도우 8 시스템에서, 정규 표현식 기반 구현이 가장 빠른 으로, 분할 및 구현 53 % 느리게되고 가입 . 정규 표현식이 내가 사용한 lorem ipsum 입력의 두 배 빠름을 의미합니다.

이 두 가지 구현을 서로 실행하는 벤치 마크를 확인하십시오 .


@ThomasLeduc 및 기타의 아래 주석에서 언급했듯이 search 에 정규 표현식에서 특수 문자로 예약 된 특정 문자가 포함 된 경우 정규 표현식 기반 구현에 문제가있을 수 있습니다 . 구현에서는 호출자가 미리 문자열을 이스케이프하거나 정규 표현식 (MDN) 의 테이블에 문자가없는 문자열 만 전달한다고 가정합니다 .

MDN은 또한 문자열을 이스케이프하기위한 구현을 제공합니다. 이것이 RegExp.escape(str) 로 표준화되어 있으면 좋겠지 만 아쉽지만 존재하지 않습니다.

function escapeRegExp(str) {
  return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
}

String.prototype.replaceAll 구현 내에서 escapeRegExp 를 호출 할 수는 있지만 이것이 성능에 얼마나 영향을 미치는지 확실하지 않습니다 (잠재적으로 모든 영숫자 문자열과 같이 이스케이프가 필요하지 않은 문자열의 경우에도).




Answer 4 Adam A


g 플래그가 설정된 정규식을 사용하면 다음이 모두 대체됩니다.

someString = 'the cat looks like a cat';
anotherString = someString.replace(/cat/g, 'dog');
// anotherString now contains "the dog looks like a dog"

여기도 참조




Answer 5 jesal


허용되는 답변을 기반으로 한 문자열 프로토 타입 함수는 다음과 같습니다.

String.prototype.replaceAll = function (find, replace) {
    var str = this;
    return str.replace(new RegExp(find, 'g'), replace);
};

EDIT

find 특수 문자가 포함 된 경우 해당 문자를 이스케이프해야합니다.

String.prototype.replaceAll = function (find, replace) {
    var str = this;
    return str.replace(new RegExp(find.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'), replace);
};

피들 : http://jsfiddle.net/cdbzL/