JavaScript를 사용하여 문자열의 모든 점을 바꾸는 방법


426

.JavaScript 문자열에서 모든 dot ( ) 을 바꾸고 싶습니다.

예를 들어, 나는 :

var mystring = 'okay.this.is.a.string';

나는 얻고 싶다 : okay this is a string.

지금까지 나는 시도했다 :

mystring.replace(/./g,' ')

그러나 이것은 모든 문자열을 공백으로 바꿉니다.


8
aefxx의 대답은 정확하지만 FYI와 마찬가지로 정규 표현식의 마침표 문자는 모든 것과 일치 하므로 모든 것이 공백입니다. 백 슬래시로 이스케이프 처리하면 기간이 일치 함을 의미합니다.
swilliams

팁 고마워. Regex와 함께 AHA 순간 (앱을 만들 때)이 있습니다. 정말 싫습니다 _ , 멋진 튜토리얼이 있습니까?
Omar Abid

rubular.com 당신이 찾고있는 것입니다
LanguagesNamedAfterCofee

1
이 사소한 일에 정규식사용하지 마십시오 .
Steven Lu

불행히도 정규 표현식이 아닌 문자열을 여러 번 교체 할 수있는 것처럼 보이지 않습니다.
Steven Lu

답변:


777

.정규 표현식에서 "임의의 문자"라는 의미를 갖기 때문에 이스케이프해야합니다 .

mystring = mystring.replace(/\./g,' ')

25
명확히하기 위해 \는 정규 표현식에서 특수 문자를 이스케이프 처리합니다. 이 경우
realgt

sed .. 어떻게 든 .. :)
Paschalis

reagukar 표현에서 점. 모든 것을 의미합니다, 이것은 올바른 해결책입니다!
Benjamin Fuentes

1
@Kingalione 정확히 작동하지 않는 것은 무엇입니까? 좀 더 자세히 설명해 주시겠습니까?
aefxx

1
@Webwoman 그것이 g표현식의 끝에 있는 수정자가 사용되는 것입니다. 그것을 (g) 전역 적으로 생각하십시오.
aefxx

302

이해하기 쉬운 하나 이상의 솔루션 :)

var newstring = mystring.split('.').join(' ');

25
@HaggleLad 당신이 정규식을 엉망으로 만들 필요가 없기 때문에
ton.yeung

5
정규식보다 훨씬 느리지 않습니까?
재스퍼 케니스

1
내 이해에서 @Jasper, 실제로 직접 벤치마킹하지는 않았지만 대부분의 브라우저에서 실제로 더 빠릅니다.
앤드류

9
@BetoFrega 사례를 만들기위한 경험적 데이터는 없습니다. :). 링크를 제공해 주셔서 감사합니다!
testing123

3
RegExp를 사용하는 경우 정규 표현식을 루프 외부의 별도 변수에 저장하려고합니다. 정규식을 컴파일 / 해석하는 데 시간이 걸리지 만 일단 컴파일되면 꽤 빨리 사용할 수 있습니다. 내가 만든 다음 테스트를 시도하십시오 : jsperf.com/replace-vs-split-join-vs-replaceall/23
sanderd17

53
/**
 * ReplaceAll by Fagner Brack (MIT Licensed)
 * Replaces all occurrences of a substring in a string
 */
String.prototype.replaceAll = function( token, newToken, ignoreCase ) {
    var _token;
    var str = this + "";
    var i = -1;

    if ( typeof token === "string" ) {

        if ( ignoreCase ) {

            _token = token.toLowerCase();

            while( (
                i = str.toLowerCase().indexOf(
                    _token, i >= 0 ? i + newToken.length : 0
                ) ) !== -1
            ) {
                str = str.substring( 0, i ) +
                    newToken +
                    str.substring( i + token.length );
            }

        } else {
            return this.split( token ).join( newToken );
        }

    }
return str;
};

alert('okay.this.is.a.string'.replaceAll('.', ' '));

정규식을 사용하는 것보다 빠릅니다 ...

편집 :
어쩌면이 코드를 수행 할 때 jsperf를 사용하지 않았습니다. 그러나 결국 그러한 논의는 전혀 의미가 없으며 성능 차이는 실제 코드의 가독성에 가치가 없으므로 성능이 정규식 접근 방식과 다르더라도 여전히 내 대답은 유효합니다.

EDIT2 :
유창한 인터페이스를 사용 하여이 작업을 수행 할 수있는 lib를 만들었습니다.

replace('.').from('okay.this.is.a.string').with(' ');

https://github.com/FagnerMartinsBrack/str-replace를 참조 하십시오 .


1
매우 유용한. 참고 : 경고문에서 세미콜론 뒤에 불량 문자가 있습니다.
Patrick

"rogue character"의 의미는 무엇입니까?
Fagner Brack 님이

1
그는 엔티티를 의미합니다 & # 8203; 유니 코드 문자 'ZERO WIDTH SPACE'(U + 200B) 인 두 번. fileformat.info/info/unicode/char/200b/index.htm에
Cœur

@FagnerBrack str.toLowerCase()성능상의 이유로 루프 외부로 이동해야합니다 . 또한 검색중인 문자열을 조작하는 것이 최적이 아닙니다. 수정 된 버전으로 답변을 게시했습니다. stackoverflow.com/questions/2390789/…
sstur

@ sstur 나는 조작 후에 문자열을 다시 소문자로 만들어야한다고 가정합니다. 검색하는 문자열을 조작하면 성능의 상당한 차이가 있습니까? 나는 가독성이 이점을 넘어서는다고 생각합니다 (예상치 않은).
Fagner Brack


15

이 간단한 시나리오의 경우 Javascript에 내장 된 메소드를 사용하는 것이 좋습니다.

당신은 이것을 시도 할 수 있습니다 :

"okay.this.is.a.string".split(".").join("")

인사말


6

점에 이중 백 슬래시를 추가하여 작동시킵니다. 격려.

var st = "okay.this.is.a.string";
var Re = new RegExp("\\.","g");
st = st.replace(Re," ");
alert(st);

4

이것은 더 간결하고 읽기 쉬우 며 Fagner Brack이 게시 한 것보다 더 잘 수행되어야합니다 (toLowerCase는 루프에서 수행되지 않음).

String.prototype.replaceAll = function(search, replace, ignoreCase) {
  if (ignoreCase) {
    var result = [];
    var _string = this.toLowerCase();
    var _search = search.toLowerCase();
    var start = 0, match, length = _search.length;
    while ((match = _string.indexOf(_search, start)) >= 0) {
      result.push(this.slice(start, match));
      start = match + length;
    }
    result.push(this.slice(start));
  } else {
    result = this.split(search);
  }
  return result.join(replace);
}

용법:

alert('Bananas And Bran'.replaceAll('An', '(an)'));

1
실제로 이스케이프 된 RegEx는 indexOf보다 성능이 우수합니다! 잘 들리지 않지만 JSPerf는 훨씬 빠르다는 것을 나타냅니다. jsperf.com/replaceall-indexof-vs-regex
sstur

어쩌면 내가 그 코드를 할 때 jsperf를 사용하지 않았을 수도 있습니다. 그러나 결국 그러한 논의는 전혀 의미가 없으며 성능 차이는 실제 코드의 가독성에 가치가 없으므로 내 대답은 여전히 ​​유효합니다.
Fagner Brack

2
String.prototype.replaceAll = function(character,replaceChar){
    var word = this.valueOf();

    while(word.indexOf(character) != -1)
        word = word.replace(character,replaceChar);

    return word;
}

3
다음과 같이하면 무한 루프에 빠지지 않습니다 replaceAll('&', '&'). (
확실히

그러나 "& amp;" 포함 &하므로 루프 에는 교체 할 항목이 절대로 없어지지 않습니다 (그리고 문자열은 계속 커집니다). 방금 시도한 결과 브라우저가 잠겼습니다.
Anentropic

2

다음은 replaceAll의 다른 구현입니다. 그것이 누군가를 돕기를 바랍니다.

    String.prototype.replaceAll = function (stringToFind, stringToReplace) {
        if (stringToFind === stringToReplace) return this;
        var temp = this;
        var index = temp.indexOf(stringToFind);
        while (index != -1) {
            temp = temp.replace(stringToFind, stringToReplace);
            index = temp.indexOf(stringToFind);
        }
        return temp;
    };

그런 다음 사용할 수 있습니다.

var myText = "내 이름은 George입니다";
var newText = myText.replaceAll ( "George", "Michael");


1
대소 문자를 구분하지 않는 검색 / 바꾸기를 처리하지 않습니다. 따라서 기능적으로 다음과 같습니다.string.split(stringToFind).join(stringToReplace)
sstur

0

예 : 모든 큰 따옴표 ( ")를 작은 따옴표 ( ')로 바꾸려면 코드는 다음과 같습니다

var str= "\"Hello\""
var regex = new RegExp('"', 'g');
str = str.replace(regex, '\'');
console.log(str); // 'Hello'

0

@scripto는 약간 더 간결하게 만들었습니다 prototype.

function strReplaceAll(s, stringToFind, stringToReplace) {
    if (stringToFind === stringToReplace) return s;
    for (let index = s.indexOf(stringToFind); index != -1; index = s.indexOf(stringToFind))
        s = s.replace(stringToFind, stringToReplace);
    return s;
}

스택 방법은 다음과 같습니다. http://jsperf.com/replace-vs-split-join-vs-replaceall/68


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


-1

RegExp javasscript 객체를 사용하여 모든 문자열 / 문자를 바꿀 수 있습니다.

코드는 다음과 같습니다.

var mystring = 'okay.this.is.a.string';

var patt = new RegExp("\\.");

while(patt.test(mystring)){

  mystring  = mystring .replace(".","");

}

-5
var mystring = 'okay.this.is.a.string';
var myNewString = escapeHtml(mystring);

function escapeHtml(text) {
if('' !== text) {
    return text.replace(/&/g, "&")
               .replace(/&lt;/g, "<")
               .replace(/&gt;/g, ">")
               .replace(/\./g,' ')
               .replace(/&quot;/g, '"')
               .replace(/&#39/g, "'");
} 

HTML을 피하려면createTextNode
Downgoat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.