Ersetzen Sie mehrere Zeichen in einem Ersetzungsaufruf


257

Sehr einfache kleine Frage, aber ich verstehe nicht ganz, wie es geht.

Ich muss jede Instanz von '_' durch ein Leerzeichen und jede Instanz von '#' durch nichts / leer ersetzen.

var string = '#Please send_an_information_pack_to_the_following_address:';

Ich habe das versucht:

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

Ich mag es nicht wirklich, solche Befehle zu verketten. Gibt es einen anderen Weg, dies in einem zu tun?


Siehe die Antwort auf diese Frage: stackoverflow.com/questions/7072330/…
DeweyOx

Antworten:


515

Verwenden Sie den Operator OR ( |):

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

Sie können auch eine Zeichenklasse verwenden:

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

Geige

Wenn Sie den Hash durch eine Sache und den Unterstrich durch eine andere ersetzen möchten, müssen Sie nur verketten. Sie können jedoch einen Prototyp hinzufügen:

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

Warum aber nicht verketten? Daran sehe ich nichts auszusetzen.


Das ist cool, aber ich muss Unterstriche durch nicht leere Leerzeichen ersetzen. Kann ich das tun?
Shannon Hochkins

Ich dachte schon, aber du hast mir trotzdem geholfen zu verstehen, wie das Ersetzen von Ausdrücken etwas besser funktioniert :)
Shannon Hochkins

Ihr Prototyp funktioniert nicht?
Können

3
Eine andere Option für #|_ist [#_], und Sie können genauso gut +aufeinanderfolgende Spiele
Ian

3
Cool danke ... wenn nötig, ersetzen Sie Leerzeichen und andere Symbole str.replace(/[+ -]/g,'');setzen Sie einfach Leerzeichen in die Mitte.
Equiman

53

Verketten ist cool, warum sollte man es ablehnen?

Wie auch immer, hier ist eine weitere Option in einem Ersatz:

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

Das Ersetzen wählt "" wenn Übereinstimmung == "#", "" wenn nicht.

[Update] Für eine allgemeinere Lösung können Sie Ihre Ersatzzeichenfolgen in einem Objekt speichern:

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];})Machen Sie den zusätzlichen Schritt: Dies erleichtert das Ändern der replaceChars.
RozzA

@RozzA danke. Object.keys war zu dieser Zeit kein Mainstream.
Christophe

Ich habe die Option für die Ersatzfunktion zum Ersetzen des zweiten Parameters völlig vergessen, damit ich mich
besser

48

Wenn Sie mehrere Zeichen ersetzen möchten, können Sie das aufrufen, String.prototype.replace()wobei das Ersetzungsargument eine Funktion ist, die für jede Übereinstimmung aufgerufen wird. Sie benötigen lediglich ein Objekt, das die Zeichenzuordnung darstellt, die Sie in dieser Funktion verwenden werden.

Wenn Sie beispielsweise adurch x, bmit yund cmit ersetzt werden möchten z, können Sie Folgendes tun:

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

Ausgabe :234xyz567yyyyxz


3
da Sie ES6 (Pfeil - Funktion) sollten Sie auch ersetzen varmit consthier. eine Alternative für erweiterte Browser-Unterstützung: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. Sie beenden die Portabilität. 2. Wenn Sie Zeichen oder s neu definieren, wird ein Laufzeitfehler angezeigt, der die Robustheit der Zeichen beeinträchtigt. 3. Es gibt keine Garantie, s vor Mutationen und erneuten Bindungen zu schützen, außer rein ideologischen. Es ist eine wunderbare Sache zu sehen, dass dieses Snippet in frisch installierten Windows98 auf Doppelklick / cscript / wscript noch funktioniert: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

Das ist sehr gut. Vielen Dank. In welchem ​​Teil haben Sie ein Objekt verwendet, um eine Anweisung oder eine Anweisung auszuführen? Haben Sie eine Dokumentation oder einen Verweis auf etwas, das das erklärt? Ziemlich guter Anwendungsfall.
Christian Matthew

39

Geben Sie das /g(globale) Flag im regulären Ausdruck an, um alle Übereinstimmungen anstelle der ersten zu ersetzen:

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

Um einen Charakter durch eine Sache und einen anderen Charakter durch etwas anderes zu ersetzen, kann man nicht wirklich herumkommen, wenn man zwei separate Anrufe benötigt replace. Sie können es wie Doorknob in eine Funktion abstrahieren, obwohl ich wahrscheinlich ein Objekt mit alt / neu als Schlüssel / Wert-Paare anstelle eines flachen Arrays verwenden würde.


Wie würde ich den Hash auch einschließen?
Shannon Hochkins

4

Sie können dies auch versuchen:

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

findbezieht sich auf den zu findenden replaceText und auf den zu ersetzenden Text

Dies ersetzt Zeichen, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird. Andernfalls ändern Sie einfach die Regex-Flags nach Bedarf. ZB: für Groß- und Kleinschreibung ersetzen:

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

4

Sie können dies einfach versuchen:

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

Dies wird., - und # durch Ihren Ersatzchar ersetzen!


Diese Antwort wurde bereits bereitgestellt und ersetzt nicht das Ersetzen verschiedener Zeichen durch andere Zeichen, siehe OP.
Shannon Hochkins

3

Hier ist eine einfache Möglichkeit, dies ohne RegEx zu tun.
Sie können die gewünschten Elemente prototypisieren und / oder zwischenspeichern.

// 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;
}

Ich weiß, dass Sie es nicht angegeben haben, aber ist es nicht viel eleganter, nur Regex zu verwenden? str.replace(/#|_/g,'')
Shannon Hochkins

1
@ ShannonHochkins Auf jeden Fall! Ich will nicht auf RegEx schlagen; Ich zeige nur eine andere Option. RegEx ist nicht immer intuitiv und eignet sich als "Hammer, der jedes Problem als Nagel behandelt". Wenn Sie sich die anderen Antworten ansehen, ist diese Funktion als wiederverwendbare Funktion nicht viel länger und die Parameter sind leicht zu verstehen. Persönlich würde ich hier eine kurze RegEx für die Frage verwenden, und es ist sinnvoll, wenn Sie nur nach einem schnellen Drop-In-Snippet suchen, das Sie gerne vollständig verstehen.
Beejor

Wenn Sie Zeichen übersetzen müssen (à la sed y- Befehl oder à la Unix tr), scheint dies die richtige Antwort zu sein.
Édouard

3

Bitte versuche:

  • Multi String ersetzen

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

  • Ersetzen Sie mehrere Zeichen

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

Viel Glück!


2

Sie können auch ein RegExp-Objekt an die Ersetzungsmethode übergeben, z

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

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

Javascript RegExp


OP möchte keine replaceAnrufe verketten - dies hilft nicht, dies zu vermeiden.
Dennis

2

yourstring = '#Bitte senden Sie ein Informationspaket an die folgende Adresse:';

Ersetzen Sie '#' durch '' und '_' durch ein Leerzeichen

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

newstring2 ist dein Ergebnis


Ihre Antwort verwendet kein Stück jQuery und folgt auch nicht dem OP '#this #is__ #a test ### ' .split ('_'). Join ('') würde nicht so funktionieren Sie würden mit mehr Leerzeichen
enden

@ShannonHochkins Wie weitere Leerzeichen werden hinzugefügt?
Hafsul Maru

Schauen Sie sich mein Beispiel an, wenn vor einem Leerzeichen ein Unterstrich oder zwei Unterstriche stehen, erhalten Sie mehrere Leerzeichen.
Shannon Hochkins

@ShannonHochkins der Fragesteller befasst sich mit der Zeichenfolge '#Bitte senden Sie eine Informationspackung an die folgende Adresse:'; Hier ist kein Platz. warum ich daran denken werde. Wenn man darüber nachdenkt, warum nur über den Weltraum, können viele andere Dinge passieren.
Hafsul Maru

Ich schlage vor, Sie lesen das OP erneut, ich bin das Originalposter und Sie können es in meiner ersten Variablen deutlich sehen var str = '#this #is__ __#a test###__'; dass diese Zeichenfolge eindeutig mehrere Leerzeichen enthält.
Shannon Hochkins

2

Hier ist eine andere Version, die String Prototype verwendet. Genießen!

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

Ich weiß nicht, wie viel dies helfen wird, aber ich wollte entfernen <b> und </b>aus meiner Zeichenfolge

also habe ich benutzt

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

Wenn Sie also eine begrenzte Anzahl von Zeichen reduzieren möchten und keine Zeit verschwenden möchten, ist dies nützlich.


-1

Hier ist eine "sichere HTML" -Funktion, die eine Funktion zum Reduzieren mehrerer Ersetzungen verwendet (diese Funktion wendet jede Ersetzung auf die gesamte Zeichenfolge an, sodass die Abhängigkeiten zwischen Ersetzungen erheblich sind).

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

Vielen Dank für den Beitrag, aber es ist ziemlich umfangreich im Vergleich zu der akzeptierten Antwort
Shannon Hochkins

Die Antwort auf die Frage ist eine einzeilige Funktion. Wie ist das "umfangreich"? Die Sicherheit von Benutzereingaben ist ein wichtiges Beispiel. Du bist zu kritisch. 'reduzieren' ist eine sehr nützliche Technik, die Sie kennen sollten.
David Spector

Ich sagte, Ihre Antwort ist zu umfangreich, es ist viel mehr Code, Sie verwenden sowieso reguläre Ausdrücke, was den Prozess nur zu kompliziert macht, nicht sicher, wie Sie denken, dass Ihre Antwort im Vergleich zu einer dieser Antworten eine Reduzierung darstellt ...
Shannon Hochkins

Meine Antwort ist eine Antwort zum Reduzieren, da sie die Funktion Array.prototype.reduce verwendet. Bei einer kürzeren Antwort wird möglicherweise eine Zeichenfolge anstelle von Eigenschaftsschlüsseln verwendet, wobei die Tatsache ausgenutzt wird, dass eine "sichere HTML" -Funktion nur beim Ersetzen einzelner Zeichen funktioniert. Ich fordere Sie auf, eine elegantere Antwort zu finden, anstatt sich in der Öffentlichkeit so grob zu beschweren.
David Spector

Eigentlich habe ich mich bedankt und Sie kritisiert, Sie haben das genommen und beschlossen, etwas Snarky zurückzuschreiben. Wenn wir mit funktionalen Methoden beginnen wollen, anstatt prototypisch verkettete Methoden durchzuführen, wie wir es sollten, dann etwas viel Einfacheres wie: jsfiddle .net / shannonhochkins / xsm9j610 / 21
Shannon Hochkins
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.