Zamień wiele znaków w jednym wywołaniu zamiany

256

Bardzo proste małe pytanie, ale nie do końca rozumiem, jak to zrobić.

Muszę zastąpić każde wystąpienie „_” spacją, a każde wystąpienie „#” niczym / pustym.

var string = '#Please send_an_information_pack_to_the_following_address:';

Próbowałem tego:

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

Nie bardzo lubię takie łańcuchowe polecenia. Czy istnieje inny sposób na zrobienie tego w jednym?

Shannon Hochkins
źródło
Zobacz odpowiedź na to pytanie: stackoverflow.com/questions/7072330/…
DeweyOx

Odpowiedzi:

513

Użyj operatora OR ( |):

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

Możesz także użyć klasy postaci:

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

Skrzypce

Jeśli chcesz zastąpić skrót jedną rzeczą, a podkreślnik inną, musisz po prostu połączyć łańcuch. Możesz jednak dodać prototyp:

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

Ale dlaczego nie łańcuch? Nie widzę w tym nic złego.

tckmn
źródło
To jest fajne, ale muszę zastąpić podkreślenia spacjami, które nie są puste, czy mogę to zrobić?
Shannon Hochkins
Tak myślałem, ale pomogłeś mi zrozumieć, w jaki sposób wyrażenia zastępujące działają nieco lepiej :)
Shannon Hochkins
Twój prototyp nie działa? czy jesteś w stanie podać przykład skrzypiec, wciąż dostaję błędy
Shannon Hochkins
3
Inną opcją #|_jest [#_], a równie dobrze możesz użyć +dopasowania dowolnych kolejnych meczów w celu poprawy wydajności
Ian
3
Fajne dzięki ... w razie potrzeby zastąp puste miejsca, a kolejne symbole str.replace(/[+ -]/g,'');po prostu umieść puste miejsce na środku.
equiman
53

Łańcuchy są fajne, po co je odrzucać?

W każdym razie tutaj jest inna opcja w jednym zamienniku:

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

Zastąpienie wybierze „” if match == "#", "" jeśli nie.

[Aktualizacja] Aby uzyskać bardziej ogólne rozwiązanie, możesz przechowywać zastępcze ciągi w obiekcie:

var replaceChars={ "#":"" , "_":" " };
string.replace(/#|_/g,function(match) {return replaceChars[match];})
Christophe
źródło
4
zrób dodatkowy krok: var regex = new RegExp( Object.keys(replaceChars).join("|"), "g"); string.replace(regex,function(match) {return replaceChars[match];})to ułatwia modyfikację replaceChars.
RozzA
@RozzA dzięki. Object.keys nie był wówczas głównym nurtem.
Christophe,
Zupełnie zapomniałem o opcji zamiany funkcji zastępowania drugiego parametru, aby pomóc mi zapamiętać :)
Luckylooke
48

Jeśli chcesz zastąpić wiele znaków, możesz wywołać String.prototype.replace()argument z argumentem zastępującym będącym funkcją wywoływaną dla każdego dopasowania. Wszystko czego potrzebujesz to obiekt reprezentujący odwzorowanie znaków, którego użyjesz w tej funkcji.

Na przykład, jeśli chcesz azastąpić x, bze yi cze zmożna zrobić coś takiego:

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

Wyjście :234xyz567yyyyxz

Voicu
źródło
3
od korzystania ES6 (funkcja strzałka) należy również wymienić varsię consttutaj. alternatywa dla rozszerzonej obsługi przeglądarki: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. zabijasz przenośność 2. jeśli zdecydujesz się przedefiniować znaki lub znaki, pojawi się błąd czasu działania, który zabija jego wytrzymałość, 3. nie ma gwarancji, że ochronisz s przed mutacją i ponownym wiązaniem innych niż czysto ideologiczne. Wspaniale jest widzieć, że ten fragment kodu będzie nadal działał w świeżo zainstalowanym systemie Windows98 po podwójnym kliknięciu / cscript / wscript: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
to jest naprawdę dobre. dzięki. Jaka jest część, w której użyłeś obiektu do wykonania instrukcji lub instrukcji? czy masz dokumentację lub odniesienie do czegoś, co to wyjaśnia. Całkiem dobry przypadek użycia.
Christian Matthew
39

Określ /g(globalną) flagę w wyrażeniu regularnym, aby zastąpić wszystkie dopasowania zamiast tylko pierwszego:

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

Aby zastąpić jedną postać jedną rzeczą, a inną postacią inną, tak naprawdę nie można się obejść, potrzebując dwóch osobnych wezwań replace. Możesz ją abstrakcyjnie przekształcić w funkcję, podobnie jak Doorknob, chociaż prawdopodobnie chciałbym, aby wziął obiekt ze starymi / nowymi parami klucz / wartość zamiast płaskiej tablicy.

Mark Reed
źródło
jak mam dołączyć również skrót?
Shannon Hochkins
4

Możesz także spróbować tego:

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

findodnosi się do tekstu, który można znaleźć, i replacedo tekstu, który ma zostać zastąpiony

Zastąpi to znaki bez rozróżniania wielkości liter. Aby zrobić inaczej, wystarczy zmienić flagi Regex zgodnie z wymaganiami. Np .: w przypadku rozróżniania wielkości liter należy wymienić:

new RegExp(find[i], 'g')
Tapan Bala
źródło
4

Możesz po prostu spróbować:

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

to zastąpi., - i # twoim zamiennikiem!

karim somai
źródło
Ta odpowiedź została już udzielona i nie obsługuje zastępowania różnych znaków innymi postaciami, patrz OP.
Shannon Hochkins,
3

Oto prosty sposób na zrobienie tego bez RegEx.
Możesz prototypować i / lub buforować rzeczy według potrzeb.

// 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;
}
Beejor
źródło
Wiem, że tego nie powiedziałeś, ale czy nie jest o wiele bardziej eleganckie użycie regexu? str.replace(/#|_/g,'')
Shannon Hochkins
1
@ShannonHochkins Na pewno! Nie chcę bashować na RegEx; Po prostu pokazuję inną opcję. RegEx nie zawsze jest intuicyjny i nadaje się do użycia „jak młotek, traktując każdy problem jak gwóźdź”. Dodatkowo, patrząc na inne odpowiedzi, ta funkcja wielokrotnego użytku nie jest o wiele dłuższa, a parametry są łatwe do zrozumienia. Osobiście wybrałbym krótki RegEx na pytanie tutaj i ma sens, jeśli szukasz szybkiego fragmentu, którego nie masz nic przeciwko niezrozumieniu.
Beejor
Dobrze, jeśli trzeba tłumaczyć do znaków (à la sed y polecenia lub à la Unix tr), to wydaje się, że właściwą odpowiedź.
Édouard
3

Proszę spróbować:

  • zastąp ciąg wielu

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

  • wymienić wiele znaków

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

Powodzenia!

Tran Hung
źródło
2

Możesz również przekazać obiekt RegExp do metody zamiany, takiej jak

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

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

JavaScript RegExp

Michael Sanchez
źródło
OP nie chce łączyć replacepołączeń - to nie pomaga tego uniknąć.
Dennis
2

yourstring = '# Please send_an_information_pack_to_the_following_address:';

zamień „#” na „” i zastąp „_” spacją

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

newstring2 to twój wynik

Hafsul Maru
źródło
Twoja odpowiedź nie używa odrobiny jQuery, a także nie jest zgodna z OP, „# ten #is__ #a test ### '.split (' _ '). Join (' ') nie działałby jak uzyskasz więcej białych znaków
Shannon Hochkins
@ShannonHochkins Jak dodać więcej białych spacji?
Hafsul Maru
Spójrz na mój przykład, gdy przed spacją jest podkreślenie lub dwa podkreślenia, będziesz mieć wiele spacji.
Shannon Hochkins,
@ShannonHochkins pytający zajmuje się ciągiem „# Please send_an_information_pack_to_the_following_address:”; tutaj nie ma miejsca. dlaczego o tym pomyślę. Pomyśl, dlaczego tylko o kosmosie może się zdarzyć wiele innych rzeczy.
Hafsul Maru
Sugeruję ponowne przeczytanie OP, jestem oryginalnym plakatem i wyraźnie widać w mojej pierwszej zmiennej var str = '#this #is__ __#a test###__';, że w tym ciągu jest wiele wyraźnych spacji.
Shannon Hochkins,
2

Oto kolejna wersja wykorzystująca String Prototype. Cieszyć się!

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"
Diego Fortes
źródło
1

Nie wiem, czy ile to pomoże, ale chciałem usunąć <b>i </b>od mojego ciąg

więc użyłem

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

więc w zasadzie, jeśli chcesz ograniczyć ograniczoną liczbę postaci i nie marnować czasu, przyda się to.

Hrishikesh Kale
źródło
-1

Oto funkcja „bezpiecznego HTML” przy użyciu funkcji wielokrotnego zastępowania „zmniejsz” (ta funkcja stosuje każdą zamianę do całego łańcucha, więc zależności między zamiennikami są znaczące).

// 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);
    }
David Spector
źródło
Dzięki za post, ale jest dość obszerny w porównaniu do zaakceptowanej odpowiedzi
Shannon Hochkins,
Odpowiedź na pytanie jest funkcją jednowierszową. Jak to jest „rozległe”? Ważnym przykładem jest zapewnienie bezpieczeństwa wprowadzania danych przez użytkownika. Jesteś zbyt krytyczny. „redukcja” jest bardzo przydatną techniką, o której powinieneś wiedzieć.
David Spector,
Powiedziałem, że twoja odpowiedź jest zbyt obszerna, to o wiele więcej kodu, i tak używasz wyrażeń regularnych, po prostu czyniąc proces zbyt skomplikowanym, nie jestem pewien, jak myślisz, że twoja odpowiedź jest redukcją w porównaniu do którejkolwiek z tych odpowiedzi ...
Shannon Hochkins,
Moja odpowiedź to odpowiedź „redukuj”, ponieważ wykorzystuje ona funkcję Array.prototype.reduce. Krótsza odpowiedź może używać ciągu zamiast kluczy właściwości, wykorzystując fakt, że funkcja „bezpiecznego HTML” działa tylko na zamianie pojedynczych znaków. Rzucam ci wyzwanie, byś zaproponował bardziej elegancką odpowiedź zamiast niegrzecznego narzekania w takich miejscach publicznych.
David Spector,
Właściwie to dziękuję i skrytykowałem cię, wziąłeś to i postanowiłeś napisać coś wulgarnego, jeśli zaczniemy od metod funkcjonalnych, a nie prototypowych metod łańcuchowych, jakimi powinniśmy być, to coś o wiele prostszego jak: jsfiddle .net / shannonhochkins / xsm9j610 / 21
Shannon Hochkins