한 번의 교체 호출에서 여러 문자 교체


257

아주 간단한 작은 질문이지만 어떻게 해야하는지 잘 모르겠습니다.

'_'의 모든 인스턴스를 공백으로 바꾸고 '#'의 모든 인스턴스를 아무것도 / 비어 있지 않아야합니다.

var string = '#Please send_an_information_pack_to_the_following_address:';

나는 이것을 시도했다 :

string.replace('#','').replace('_', ' ');

나는 이와 같은 명령을 연결하는 것을 정말로 좋아하지 않습니다. 한 가지 방법으로 다른 방법이 있습니까?


이 질문에 대한 답변을 참조하십시오 : stackoverflow.com/questions/7072330/…
DeweyOx

답변:


514

OR 연산자 ( |)를 사용하십시오 .

var str = '#this #is__ __#a test###__';
str.replace(/#|_/g,''); // result: "this is a test"

문자 클래스를 사용할 수도 있습니다.

str.replace(/[#_]/g,'');

깡깡이

해시를 한 것으로 바꾸고 밑줄을 다른 것으로 바꾸려면 체인을 연결해야합니다. 그러나 프로토 타입을 추가 할 수 있습니다.

String.prototype.allReplace = function(obj) {
    var retStr = this;
    for (var x in obj) {
        retStr = retStr.replace(new RegExp(x, 'g'), obj[x]);
    }
    return retStr;
};

console.log('aabbaabbcc'.allReplace({'a': 'h', 'b': 'o'}));
// console.log 'hhoohhoocc';

그래도 왜 체인을하지 않습니까? 나는 그것에 아무런 문제가 없다.


이것은 멋지지만 밑줄을 공백이 아닌 공백으로 바꿔야합니다.이 작업을 수행 할 수 있습니까?
Shannon Hochkins

그렇게 생각했지만 그래도 대체 표현식이 어떻게 더 잘 작동하는지 이해하도록 도와주었습니다.)
Shannon Hochkins

프로토 타입이 작동하지 않습니까? 바이올린에 대한 예제를 제공 할 수
있습니까

3
에 대한 또 다른 옵션은 #|_입니다 [#_]. +성능을 향상시키기 위해 연속 경기와 일치하는 데 사용할 수도 있습니다.
Ian

3
감사합니다 ... 빈 공간을 교체 해야하는 경우 다른 기호 str.replace(/[+ -]/g,'');는 중간에 빈 공간을 두십시오.
equiman

53

체이닝이 멋지다

어쨌든, 여기에 하나의 대체 옵션이 있습니다.

string.replace(/#|_/g,function(match) {return (match=="#")?"":" ";})

대체는 "= match # ="# "인 경우" ", 그렇지 않은 경우" "를 선택합니다.

[업데이트]보다 일반적인 솔루션을 위해 대체 문자열을 객체에 저장할 수 있습니다.

var replaceChars={ "#":"" , "_":" " };
string.replace(/#|_/g,function(match) {return replaceChars[match];})

4
추가 단계를 수행하십시오. var regex = new RegExp( Object.keys(replaceChars).join("|"), "g"); string.replace(regex,function(match) {return replaceChars[match];})이렇게하면 replaceChars를 쉽게 수정할 수 있습니다.
RozzA

@RozzA 감사합니다. 당시 Object.keys는 주류가 아니 었습니다.
Christophe

:) 나를 기억 도와, 두 번째 매개 변수를 대체 내가 완전히 대체 기능 옵션을 잊었다
Luckylooke

48

여러 문자를 바꾸려면 String.prototype.replace()각 일치 항목에 대해 호출되는 함수 인 replacement 인수를 사용 하여 with를 호출 할 수 있습니다 . 해당 기능에 사용할 문자 매핑을 나타내는 객체 만 있으면됩니다.

당신이 원하는 경우 예를 들어, a교체 x, byc함께 z, 당신은 이런 식으로 뭔가를 할 수 있습니다 :

var chars = {'a':'x','b':'y','c':'z'};
var s = '234abc567bbbbac';
s = s.replace(/[abc]/g, m => chars[m]);
console.log(s);

출력 :234xyz567yyyyxz


3
당신이 ES6를 사용하기 때문에 당신은 또한 교체해야합니다 (기능 화살표) var과 함께 const여기. 확장 된 브라우저 지원을위한 대안 :var s ='234abc567bbbbac'; s = s.replace(/[abc]/g, function(m) { return {'a':'x','b':'y','c':'z'}[m]; }); console.log(s);
Felix Geenen

1
@FelixGeenen 1. 이식성을 죽입니다. 2. 문자 나 s를 재정의하기로 선택하면 런타임 오류가 발생하여 그 견고성을 떨어 뜨립니다. 이 스 니펫이 더블 클릭 / 크립 / 스크립트에서 새로 설치된 windows98에서 여전히 작동한다는 것을 아는 것은 훌륭한 일입니다.var chars = {a:'1', b:'2', c:'3'}; var s = '123abc123'; var u = s.replace(/[abc]/g, function(m) { return chars[m]; }); WScript.echo(u);
Dmitry

정말 좋습니다. 감사. 객체를 사용하여 또는 문을 수행 한 부분은 무엇입니까? 그것을 설명하는 문서 또는 참조가 있습니까? 꽤 좋은 사용 사례.
Christian Matthew

39

/g정규식에 (global) 플래그를 지정하여 첫 번째 항목 대신 모든 일치 항목을 바꾸십시오.

string.replace(/_/g, ' ').replace(/#/g, '')

한 캐릭터를 다른 것으로 바꾸고 다른 캐릭터를 다른 것으로 바꾸려면에 대해 두 번의 별도 호출이 필요하지 않습니다 replace. Doorknob처럼 함수로 추상화 할 수 있지만 플랫 배열 대신 키 / 값 쌍으로 old / new를 가진 객체를 가져야 할 것입니다.


해시도 어떻게 포함합니까?
Shannon Hochkins

4

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

function replaceStr(str, find, replace) {
    for (var i = 0; i < find.length; i++) {
        str = str.replace(new RegExp(find[i], 'gi'), replace[i]);
    }
    return str;
}

var text = "#here_is_the_one#";
var find = ["#","_"];
var replace = ['',' '];
text = replaceStr(text, find, replace);
console.log(text);

find텍스트에 의미를 찾을 수하고 replace텍스트로 대체 할 수

대소 문자를 구분하지 않는 문자를 대체합니다. 그렇지 않으면 필요에 따라 Regex 플래그를 변경하십시오. 예 : 대소 문자 구분 바꾸기 :

new RegExp(find[i], 'g')

4

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

str.replace(/[.#]/g, 'replacechar');

이것은.,-및 #을 replacechar로 대체합니다!


이 답변은 이미 제공되었으며 다른 문자를 다른 문자로 바꾸는 것을 처리하지 않습니다 (OP 참조).
Shannon Hochkins

3

RegEx없이 간단한 방법이 있습니다.
원하는대로 프로토 타입 및 / 또는 캐시 할 수 있습니다.

// Example: translate( 'faded', 'abcdef', '123456' ) returns '61454'
function translate( s, sFrom, sTo ){
    for ( var out = '', i = 0; i < s.length; i++ ){
        out += sTo.charAt( sFrom.indexOf( s.charAt(i) ));
    }
    return out;
}

나는 당신이 그것을 밝히지 않았다는 것을 알고 있지만 정규 표현식을 사용하는 것이 훨씬 우아하지 않습니까? str.replace(/#|_/g,'')
Shannon Hochkins

1
@ShannonHochkins 확실히! RegEx를 강타한다는 의미는 아닙니다. 다른 옵션을 보여주고 있습니다. RegEx가 항상 직관적 인 것은 아니며 "모든 문제를 손톱으로 다루는 망치"로 사용되기에 적합합니다. 또한 다른 답변을 살펴보면 재사용 가능한 기능 으로이 기능은 훨씬 길지 않으며 매개 변수를 이해하기 쉽습니다. 개인적으로 나는 여기에 대한 질문에 대한 짧은 RegEx를 사용할 것입니다. 완전히 이해하지 못하는 빠른 드롭 인 스 니펫을 찾고 있다면 의미가 있습니다.
Beejor

문자 를 번역 해야하는 경우 (à la sed y 명령 또는 a la Unix tr), 정답처럼 보입니다.
Édouard

3

시도하십시오 :

  • 멀티 스트링 교체

    var str = "http://www.abc.xyz.com"; str = str.replace(/http:|www|.com/g, ''); //str is "//.abc.xyz"

  • 여러 문자를 교체

    var str = "a.b.c.d,e,f,g,h"; str = str.replace(/[.,]/g, ''); //str is "abcdefgh";

행운을 빕니다!


2

RegExp 객체를 다음과 같이 replace 메소드에 전달할 수도 있습니다.

var regexUnderscore = new RegExp("_", "g"); //indicates global match
var regexHash = new RegExp("#", "g");

string.replace(regexHash, "").replace(regexUnderscore, " ");

자바 스크립트 정규식


OP는 replace통화 를 연결하고 싶지 않습니다.이를 피하는 데 도움이되지 않습니다.
Dennis

2

yourstring = '# 발송 _an_information_pack_to_the_following_address :';

'#'을 '로 바꾸고'_ '를 공백으로 바꾸십시오.

var newstring1 = yourstring.split('#').join('');
var newstring2 = newstring1.split('_').join(' ');

newstring2는 결과입니다


귀하의 답변은 jQuery 조각을 사용하지 않으며 OP를 따르지 않습니다. '#this #is__ #a test ### '. split ( '_'). join ( '') 더 많은 공백이
생길 것입니다

@ShannonHochkins 공백은 어떻게 추가됩니까?
Hafsul Maru

공백 앞에 밑줄이 있거나 두 개의 밑줄이 있으면 내 예를 살펴보고 여러 공백으로 끝납니다.
Shannon Hochkins

@ShannonHochkins는 질문자가 '#Please send_an_information_pack_to_the_following_address :'문자열을 처리합니다. 여기에는 공간이 없습니다. 왜 내가 생각할까요. 생각할 때 왜 공간에 대해서만 다른 많은 일들이 일어날 수 있습니다.
Hafsul Maru

나는 당신이 OP를 다시 읽을 것을 제안합니다, 나는 원래 포스터이고 당신은 내 첫 변수에서 명확하게 볼 수 있습니다 var str = '#this #is__ __#a test###__'; 에서이 문자열에 여러 개의 공백이 있음을 .
Shannon Hochkins

2

다음은 String Prototype을 사용하는 다른 버전입니다. 즐겨!

String.prototype.replaceAll = function(obj) {
    let finalString = '';
    let word = this;
    for (let each of word){
        for (const o in obj){
            const value = obj[o];
            if (each == o){
                each = value;
            }
        }
        finalString += each;
    }

    return finalString;
};

'abc'.replaceAll({'a':'x', 'b':'y'}); //"xyc"

1

이것이 얼마나 도움이 될지 모르겠지만 제거하고 싶었습니다. <b></b> 문자열에서 하고

그래서 나는 사용했다

mystring.replace('<b>',' ').replace('</b>','');

따라서 기본적으로 제한된 수의 문자를 줄이고 시간을 낭비하지 않으려면 유용합니다.


-1

다음은 'reduce'다중 대체 함수를 사용하는 "안전한 HTML"함수입니다 (이 함수는 각 대체를 전체 문자열에 적용하므로 대체 간의 종속성이 중요합니다).

// Test:
document.write(SafeHTML('<div>\n\
    x</div>'));

function SafeHTML(str)
    {
    const replacements = [
        {'&':'&amp;'},
        {'<':'&lt;'},
        {'>':'&gt;'},
        {'"':'&quot;'},
        {"'":'&apos;'},
        {'`':'&grave;'},
        {'\n':'<br>'},
        {' ':'&nbsp;'}
        ];
    return replaceManyStr(replacements,str);
    } // HTMLToSafeHTML

function replaceManyStr(replacements,str)
    {
    return replacements.reduce((accum,t) => accum.replace(new RegExp(Object.keys(t)[0],'g'),t[Object.keys(t)[0]]),str);
    }

게시물 주셔서 감사하지만, 그것은 받아 들인 답변에 비해 상당히 광범위하다
Shannon Hochkins

질문에 대한 답변은 한 줄 기능입니다. 그 "어떻게"광범위합니까? 사용자 입력을 안전하게 만드는 것이 중요한 예입니다. 당신은 너무 비판적입니다. '감소'는 알아야 할 매우 유용한 기술입니다.
David Spector

귀하의 답변이 너무 광범위하고 코드가 많으며 어쨌든 정규 표현식을 사용하고 있으며 프로세스를 너무 복잡하게 만들고 응답이 이러한 답변에 비해 감소라고 어떻게 생각하는지 잘 모르겠습니다 ...
Shannon Hochkins

내 대답은 Array.prototype.reduce 함수를 사용하기 때문에 '감소'응답입니다. 더 짧은 대답은 속성 키 대신 문자열을 사용하여 "안전한 HTML"기능이 단일 문자 교체에서만 작동한다는 사실을 이용합니다. 나는 이와 같이 대중에게 무례하게 불평하는 대신보다 우아한 답변을 제시하도록 당신에게 도전합니다.
David Spector

실제로 저는 고맙다고 말하고 비판을주었습니다. 우리가 프로토 타입 체인 방식이 아닌 기능적 메소드로 시작한다면, 다음과 같이 훨씬 간단한 무언가를 다시 작성하기로 결정했습니다 : jsfiddle .net / shannonhochkins / xsm9j610 / 21
Shannon Hochkins 2009
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.