Ich versuche, mehrere Wörter in einer Zeichenfolge durch mehrere andere Wörter zu ersetzen. Die Zeichenfolge lautet "Ich habe eine Katze, einen Hund und eine Ziege."
Dies erzeugt jedoch nicht "Ich habe einen Hund, eine Ziege und eine Katze", sondern "Ich habe eine Katze, eine Katze und eine Katze". Ist es in JavaScript möglich, mehrere Zeichenfolgen gleichzeitig durch mehrere andere Zeichenfolgen zu ersetzen, damit das richtige Ergebnis erzielt wird?
var str = "I have a cat, a dog, and a goat.";
str = str.replace(/cat/gi, "dog");
str = str.replace(/dog/gi, "goat");
str = str.replace(/goat/gi, "cat");
//this produces "I have a cat, a cat, and a cat"
//but I wanted to produce the string "I have a dog, a goat, and a cat".
Antworten:
Spezifische Lösung
Sie können eine Funktion verwenden, um jede zu ersetzen.
jsfiddle Beispiel
Verallgemeinern
Wenn Sie den regulären Ausdruck dynamisch beibehalten und der Karte nur zukünftige Austausche hinzufügen möchten, können Sie dies tun
um den regulären Ausdruck zu erzeugen. Dann würde es so aussehen
Und um weitere Ersetzungen hinzuzufügen oder zu ändern, können Sie einfach die Karte bearbeiten.
Geige mit dynamischem Regex
Wiederverwendbar machen
Wenn Sie möchten, dass dies ein allgemeines Muster ist, können Sie dies auf eine Funktion wie diese ziehen
Dann könnten Sie einfach die str und eine Zuordnung der gewünschten Ersetzungen an die Funktion übergeben und die transformierte Zeichenfolge zurückgeben.
Geige mit der Funktion
Um sicherzustellen, dass Object.keys in älteren Browsern funktioniert, fügen Sie eine Polyfüllung hinzu, z. B. aus MDN oder Es5 .
quelle
.
Notation einfach nicht mit all diesen Eigenschaften verwenden. Die Notation in Klammern funktioniert mit jeder Zeichenfolge.map={'.': ',', ',': '.'}
und Regex verwende/\.|,/g
.return mapObj[matched.toLowerCase()];
,return mapObj[matched];
da ich Groß- und Kleinschreibung verwendemapObj
.Object.keys(mapObj).map(key => key.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')).join('|')
. Inspiriert von dieser AntwortDies entspricht möglicherweise nicht genau Ihren Anforderungen in diesem Fall, aber ich habe festgestellt, dass dies als allgemeine Lösung eine nützliche Möglichkeit ist, mehrere Parameter in Zeichenfolgen zu ersetzen. Es werden alle Instanzen der Parameter ersetzt, unabhängig davon, wie oft auf sie verwiesen wird:
Sie würden es wie folgt aufrufen:
quelle
Verwenden Sie nummerierte Elemente, um ein erneutes Ersetzen zu verhindern. z.B
dann
So funktioniert es: -% \ d + findet die Zahlen, die nach einem% stehen. Die Klammern erfassen die Nummer.
Diese Zahl (als Zeichenfolge) ist der zweite Parameter n für die Lambda-Funktion.
Das + n-1 konvertiert die Zeichenfolge in die Zahl, dann wird 1 subtrahiert, um das Haustierarray zu indizieren.
Die% -Zahl wird dann durch die Zeichenfolge am Array-Index ersetzt.
Das / g bewirkt, dass die Lambda-Funktion wiederholt mit jeder Nummer aufgerufen wird, die dann durch eine Zeichenfolge aus dem Array ersetzt wird.
In modernem JavaScript: -
quelle
Das hat bei mir funktioniert:
quelle
using Array.prototype.reduce () :
Beispiel
quelle
${f}
anstelle von f den akkumulierten Wert zu verwenden?${f}
.replace (new RegExp (Object.keys (s) [) 0], 'g'), s [Object.keys (s) [0]]), Satz 1) "Nur für den Fall, dass sich jemand fragt, warum die Lösung des Originalplakats nicht funktioniert:
quelle
Benutzer reguläre Funktion, um das zu ersetzende Muster zu definieren und dann die Ersetzungsfunktion zu verwenden, um an der Eingabezeichenfolge zu arbeiten.
quelle
RegExp
Objekt verwenden, um das Problem zu lösenvar i = new RegExp('}','g'), j = new RegExp('{','g'), k = data.replace(i,'{').replace(j,'}');
Mit meinem einmaligen Ersatzpaket können Sie Folgendes tun:
quelle
quelle
Sie können Zeichenfolgen mithilfe von Trennzeichen suchen und ersetzen.
quelle
/ * replaceEinige Methode für Zeichenfolgen, für die so viele Argumente benötigt werden, wie wir möchten, und ersetzt sie alle durch das letzte Argument, das wir angegeben haben. 2013 CopyRights gespeichert für: Max Ahmed Dies ist ein Beispiel:
* /
jsFiddle: http://jsfiddle.net/CPj89/
quelle
quelle
Ich habe dieses npm-Paket stringinject https://www.npmjs.com/package/stringinject geschrieben , mit dem Sie Folgendes tun können
Dadurch werden {0} und {1} durch die Array-Elemente ersetzt und die folgende Zeichenfolge zurückgegeben
oder Sie können Platzhalter durch Objektschlüssel und Werte wie folgt ersetzen:
quelle
Sie können zu diesem Zweck https://www.npmjs.com/package/union-replacer verwenden. Es handelt sich im Grunde genommen um ein
string.replace(regexp, ...)
Gegenstück, bei dem mehrere Ersetzungen in einem Durchgang erfolgen können, während die volle Leistung von erhalten bleibtstring.replace(...)
.Offenlegung: Ich bin der Autor. Die Bibliothek wurde entwickelt, um komplexere vom Benutzer konfigurierbare Ersetzungen zu unterstützen. Sie behandelt alle problematischen Dinge wie Erfassungsgruppen, Rückreferenzen und Ersetzen von Rückruffunktionen.
Die oben genannten Lösungen sind jedoch gut genug, um die Saiten exakt zu ersetzen.
quelle
Ich habe @BenMcCormicks ein bisschen erweitert. Er arbeitete für normale Saiten, aber nicht, wenn ich Charakteren oder Platzhaltern entkommen war. Folgendes habe ich getan
gibt "bla bla 234433 bla bla" zurück
Auf diese Weise stimmt es mit dem Schlüssel in mapObj überein und nicht mit dem übereinstimmenden Wort '
quelle
Lösung mit Jquery (zuerst diese Datei einschließen): Ersetzen Sie mehrere Zeichenfolgen durch mehrere andere Zeichenfolgen:
quelle
javascript tag added in question, and jquery is a libarary of javascript.
Hmmm, diese Logik ist ausgeschaltet, es sollte umgekehrt sein und auch nur ein Kopf hoch - von Javascript-Tag-Informationen: " Sofern kein anderes Tag für ein Framework / eine Bibliothek enthalten ist, wird eine reine JavaScript-Antwort erwartet. "