programing

1개의 치환콜로 여러 문자를 치환하다

newsource 2022. 11. 17. 21:16

1개의 치환콜로 여러 문자를 치환하다

'_'의 모든 인스턴스를 공백으로 바꾸고 '#'의 모든 인스턴스를 아무것도 또는 비워 두어야 합니다.

var string = '#Please send_an_information_pack_to_the_following_address:';

저도 해봤어요.

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

나는 이런 명령어 체인을 별로 좋아하지 않는다.다른 방법으로 할 수 있는 방법이 있나요?

연산자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';

왜 쇠사슬을 매지 않는 거죠?난 그게 문제될 게 없다고 본다.

복수의 문자를 치환하는 경우는, 일치 마다 호출되는 함수로서 replacement 인수를 사용해 를 호출할 수 있습니다.필요한 것은 해당 함수로 사용할 문자 매핑을 나타내는 객체입니다.

를 들어, 「」가 는,ax,by , , , , 입니다.cz을 사용하다

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

출력:234xyz567yyyyxz

체인은 멋진데, 왜 무시해?

어쨌든, 여기 다른 옵션이 있습니다.

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

치환자는 match=="#", 그렇지 않으면 ""를 선택합니다.

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

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

명기해 주세요./g글로벌)하여 첫 합니다.

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

한로, 글자로 는 두 의 콜이 하다, 라고 하는 수 .replaceDoorknob과 같은 함수로 추상화할 수 있습니다.단, 플랫 어레이가 아닌 old/new의 오브젝트를 키/값의 쌍으로 받아들이도록 하겠습니다.

이게 얼마나 도움이 될지는 모르겠지만 제거하려고요<b> ★★★★★★★★★★★★★★★★★」</b> 스트링에서

그래서 저는

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

따라서 기본적으로 글자 수를 줄이고 시간을 낭비하지 않는 것이 좋습니다.

복수의 기판을 단순한 정규식으로 대체할 수 있다.를 들어, '', '아까', '아까', '아까'라는를 만들어요.(123) 456-78901234567890이데올로기 때문에

var a = '(123) 456-7890';
var b = a.replace(/[() -]/g, '');
console.log(b); // results 1234567890

[] 사이에 교체할 서브스트링을 전달할 수 있으며 대신 사용할 스트링은 치환 함수에 대한 두 번째 파라미터로 전달되어야 합니다.

두 번째 업데이트

저는 생산에서 사용하기 위해 다음과 같은 기능을 개발했습니다.아마 다른 사람에게 도움이 될 것입니다.기본적으로 네이티브의 replaceAll Javascript 함수의 루프이며 regex를 사용하지 않습니다.

function replaceMultiple(text, characters){
  for (const [i, each] of characters.entries()) {
    const previousChar = Object.keys(each);
    const newChar = Object.values(each);

    text = text.replaceAll(previousChar, newChar);
  }  
  
return text
}

사용법은 매우 간단합니다.OP의 예를 사용하면 다음과 같습니다.


const text = '#Please send_an_information_pack_to_the_following_address:';
const characters = [
    {
    "#":""
    },
   {
    "_":" "
    },
]

const result = replaceMultiple(text, characters);

console.log(result); //'Please send an information pack to the following address:'

갱신하다

이제 replaceAll을 네이티브로 사용할 수 있습니다.

오래된 답변

다음은 String 프로토타입을 사용한 다른 버전입니다.맛있게 드세요!

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"

다음과 같이 시도해 볼 수 있습니다.

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

.-와 #가 치환됩니다!

시험해 보세요:

  • 다중 문자열을 바꿉니다.

    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";

행운을 빕니다.

여기 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;
}

다음과 같은 방법도 있습니다.

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')

RegExp 개체를 다음과 같은 대체 메서드에 전달할 수도 있습니다.

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

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

Javascript RegExp

yourstring = '#please_an_information_pack_to_the_information_address:';

'#'을 '로 바꾸고 '_'를 공백으로 바꿉니다.

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

newstring2가 결과입니다.

아무것도 없는 경우 tckmn의 답변이 가장 좋습니다.

일치에 대응하는 특정 문자열로 치환할 필요가 있는 경우는, Voiceu 와 Christope 의 답변의 바리에이션을 참조해 주세요.이것에 의해, 일치하고 있는 문자열의 중복을 회피할 수 있기 때문에, 2 개의 장소에 새로운 일치를 추가할 필요가 없습니다.

const replacements = {
  '’': "'",
  '“': '"',
  '”': '"',
  '—': '---',
  '–': '--',
};
const replacement_regex = new RegExp(Object
  .keys(replacements)
  // escape any regex literals found in the replacement keys:
  .map(e => e.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))
  .join('|')
, 'g');
return text.replace(replacement_regex, e => replacements[e]);

이건 이디시랑 네쿠데스 같은 캐릭터에 잘 어울려요.

var string = "נׂקֹוַדֹּוֶת";


var string_norm = string.replace(/[ְֱֲֳִֵֶַָֹֹּׁׂ]/g, '');
document.getElementById("demo").innerHTML = (string_norm);

다음은 'reduce' 다중 치환 함수를 사용하는 "safe 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);
    }

String.prototype.replaceAll=function(obj,keydata='key'){
 const keys=keydata.split('key');
return Object.entries(obj).reduce((a,[key,val])=> a.replace(new RegExp(`${keys[0]}${key}${keys[1]}`,'g'),val),this)
}

const data='hids dv sdc sd {yathin} {ok}'
console.log(data.replaceAll({yathin:12,ok:'hi'},'{key}'))

왜 아직 아무도 이 솔루션을 제안하지 않았는지 모르겠지만, 저는 이것이 꽤 잘 작동한다는 것을 알았습니다.

var string = '#Please send_an_information_pack_to_the_following_address:'
var placeholders = [
    "_": " ",
    "#": ""
]

for(var placeholder in placeholders){
    while(string.indexOf(placeholder) > -1) {
        string = string.replace(placeholder, placeholders[placeholder])
    }
}

기능을 업데이트하지 않고도 원하는 플레이스 홀더로 추가할 수 있습니다.심플!

하나의 기능과 하나의 프로토타입 기능.

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


            var map = {
                '&': 'and ',
                '[?]': '',
                '/': '',
                '#': '',
                // '|': '#65 ',
                // '[\]': '#66 ',
                // '\\': '#67 ',
                // '^': '#68 ',
                '[?&]': ''
            };


             var map2 = [
                {'&': 'and '},
                {'[?]': ''},
                {'/': ''},
                {'#': ''},                
                {'[?&]': ''}
            ];

            name = replaceAll2(name, map2);
            name = replaceAll(name, map);


    function replaceAll2(str, map) {            
        return replaceManyStr(map, str);
    }  

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

if other 스테이트먼트의 줄임말을 사용하면 어떻게 될까요? 원라이너로 만들 수 있습니다.

const betterWriting = string.replace(/[#_]/gi , d => d === '#' ? '' : ' ' );

언급URL : https://stackoverflow.com/questions/16576983/replace-multiple-characters-in-one-replace-call