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 stattdessen "Ich habe eine Katze, eine Katze und eine Katze". Ist es möglich, mehrere Zeichenfolgen gleichzeitig in JavaScript durch mehrere andere Zeichenfolgen zu ersetzen, damit das korrekte 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".
Sie können jede Funktion durch eine Funktion ersetzen.
var str = "I have a cat, a dog, and a goat.";
var mapObj = {
cat:"dog",
dog:"goat",
goat:"cat"
};
str = str.replace(/cat|dog|goat/gi, function(matched){
return mapObj[matched];
});
Wenn Sie den Regex dynamisch pflegen und nur zukünftige Börsen zur Karte hinzufügen möchten, können Sie dies tun
new RegExp(Object.keys(mapObj).join("|"),"gi");
den Regex erzeugen. Dann würde es so aussehen
var mapObj = {cat:"dog",dog:"goat",goat:"cat"};
var re = new RegExp(Object.keys(mapObj).join("|"),"gi");
str = str.replace(re, function(matched){
return mapObj[matched];
});
Wenn Sie weitere Ersetzungen hinzufügen oder ändern möchten, können Sie die Karte einfach bearbeiten.
Wenn Sie möchten, dass dies ein allgemeines Muster ist, können Sie dieses zu einer Funktion wie dieser ziehen
function replaceAll(str,mapObj){
var re = new RegExp(Object.keys(mapObj).join("|"),"gi");
return str.replace(re, function(matched){
return mapObj[matched.toLowerCase()];
});
}
Dann könnten Sie einfach die Zeichenfolge str und eine Karte der gewünschten Ersetzungen an die Funktion übergeben und die transformierte Zeichenfolge würde zurückgegeben.
Um sicherzustellen, dass Object.keys in älteren Browsern funktioniert, fügen Sie eine Polyfill hinzu, z. B. aus MDN oder Es5 .
Dies entspricht möglicherweise nicht genau Ihrem Bedarf in diesem Fall, aber ich habe festgestellt, dass dies eine sinnvolle Möglichkeit ist, mehrere Parameter in Zeichenfolgen als allgemeine Lösung zu ersetzen. Es werden alle Instanzen der Parameter ersetzt, unabhängig davon, wie oft auf sie verwiesen wird:
String.prototype.fmt = function (hash) {
var string = this, key; for (key in hash) string = string.replace(new RegExp('\\{' + key + '\\}', 'gm'), hash[key]); return string
}
Sie würden es wie folgt aufrufen:
var person = '{title} {first} {last}'.fmt({ title: 'Agent', first: 'Jack', last: 'Bauer' });
// person = 'Agent Jack Bauer'
Das hat für mich funktioniert:
String.prototype.replaceAll = function(search, replacement) {
var target = this;
return target.replace(new RegExp(search, 'g'), replacement);
};
function replaceAll(str, map){
for(key in map){
str = str.replaceAll(key, map[key]);
}
return str;
}
//testing...
var str = "bat, ball, cat";
var map = {
'bat' : 'foo',
'ball' : 'boo',
'cat' : 'bar'
};
var new = replaceAll(str, map);
//result: "foo, boo, bar"
benutzer reguläre Funktion zum Definieren des zu ersetzenden Musters und Verwendung der Ersetzungsfunktion zum Bearbeiten der Eingabezeichenfolge.
var i = new RegExp('"{','g'),
j = new RegExp('}"','g'),
k = data.replace(i,'{').replace(j,'}');
Verwenden Sie nummerierte Elemente, um ein erneutes Ersetzen zu verhindern
let str = "I have a %1, a %2, and a %3";
let pets = ["dog","cat", "goat"];
dann
str.replace(/%(\d+)/g, (_, n) => pets[+n-1])
Wie es funktioniert: -%\D + findet die Zahlen, die nach einem% kommen. Die Klammern erfassen die Nummer.
Diese Zahl (als String) ist der 2. Parameter n der Lambda-Funktion.
+ N-1 konvertiert den String in die Zahl, dann wird 1 abgezogen, um das Feld für Haustiere zu indizieren.
Die% -Zahl wird dann durch die Zeichenfolge am Array-Index ersetzt.
Das/g bewirkt, dass die Lambda-Funktion mit jeder Nummer wiederholt aufgerufen wird, die dann durch einen String aus dem Array ersetzt wird.
Im modernen JavaScript: -
replace_n=(str,...ns)=>str.replace(/%(\d+)/g,(_,n)=>ns[n-1])
Nur für den Fall, dass sich jemand wundert, warum die Lösung des ursprünglichen Posters nicht funktioniert:
var str = "I have a cat, a dog, and a goat.";
str = str.replace(/cat/gi, "dog");
// now str = "I have a dog, a dog, and a goat."
str = str.replace(/dog/gi, "goat");
// now str = "I have a goat, a goat, and a goat."
str = str.replace(/goat/gi, "cat");
// now str = "I have a cat, a cat, and a cat."
using Array.prototype.reduce () :
const arrayOfObjects = [
{ plants: 'men' },
{ smart:'dumb' },
{ peace: 'war' }
]
const sentence = 'plants are smart'
arrayOfObjects.reduce(
(f, s) => `${f}`.replace(Object.keys(s)[0], s[Object.keys(s)[0]]), sentence
)
// as a reusable function
const replaceManyStr = (obj, sentence) => obj.reduce((f, s) => `${f}`.replace(Object.keys(s)[0], s[Object.keys(s)[0]]), sentence)
const result = replaceManyStr(arrayOfObjects , sentence1)
Beispiel
// ///////////// 1. replacing using reduce and objects
// arrayOfObjects.reduce((f, s) => `${f}`.replace(Object.keys(s)[0], s[Object.keys(s)[0]]), sentence)
// replaces the key in object with its value if found in the sentence
// doesn't break if words aren't found
// Example
const arrayOfObjects = [
{ plants: 'men' },
{ smart:'dumb' },
{ peace: 'war' }
]
const sentence1 = 'plants are smart'
const result1 = arrayOfObjects.reduce((f, s) => `${f}`.replace(Object.keys(s)[0], s[Object.keys(s)[0]]), sentence1)
console.log(result1)
// result1:
// men are dumb
// Extra: string insertion python style with an array of words and indexes
// usage
// arrayOfWords.reduce((f, s, i) => `${f}`.replace(`{${i}}`, s), sentence)
// where arrayOfWords has words you want to insert in sentence
// Example
// replaces as many words in the sentence as are defined in the arrayOfWords
// use python type {0}, {1} etc notation
// five to replace
const sentence2 = '{0} is {1} and {2} are {3} every {5}'
// but four in array? doesn't break
const words2 = ['man','dumb','plants','smart']
// what happens ?
const result2 = words2.reduce((f, s, i) => `${f}`.replace(`{${i}}`, s), sentence2)
console.log(result2)
// result2:
// man is dumb and plants are smart every {5}
// replaces as many words as are defined in the array
// three to replace
const sentence3 = '{0} is {1} and {2}'
// but five in array
const words3 = ['man','dumb','plant','smart']
// what happens ? doesn't break
const result3 = words3.reduce((f, s, i) => `${f}`.replace(`{${i}}`, s), sentence3)
console.log(result3)
// result3:
// man is dumb and plants
var str = "I have a cat, a dog, and a goat.";
str = str.replace(/goat/i, "cat");
// now str = "I have a cat, a dog, and a cat."
str = str.replace(/dog/i, "goat");
// now str = "I have a cat, a goat, and a cat."
str = str.replace(/cat/i, "dog");
// now str = "I have a dog, a goat, and a cat."
String.prototype.replaceSome = function() {
var replaceWith = Array.prototype.pop.apply(arguments),
i = 0,
r = this,
l = arguments.length;
for (;i<l;i++) {
r = r.replace(arguments[i],replaceWith);
}
return r;
}
/ * replaceSome-Methode für Stringsit akzeptiert beliebig viele Argumente und ersetzt alle -Dateien durch das letzte Argument, das wir angegeben haben 2013 CopyRights gespeichert für: Max Ahmed Dies ist ein Beispiel:
var string = "[hello i want to 'replace x' with eat]";
var replaced = string.replaceSome("]","[","'replace x' with","");
document.write(string + "<br>" + replaced); // returns hello i want to eat (without brackets)
* /
jsFiddle: http://jsfiddle.net/CPj89/
Verwenden von jQuery Ersetzen Sie mehrere Zeichenfolgen durch mehrere andere Zeichenfolgen:
var replacetext = {
"abc": "123",
"def": "456"
"ghi": "789"
};
$.each(replacetext, function(txtorig, txtnew) {
$(".eng-to-urd").each(function() {
$(this).text($(this).text().replace(txtorig, txtnew));
});
});
<!DOCTYPE html>
<html>
<body>
<p id="demo">Mr Blue
has a blue house and a blue car.</p>
<button onclick="myFunction()">Try it</button>
<script>
function myFunction() {
var str = document.getElementById("demo").innerHTML;
var res = str.replace(/\n| |car/gi, function myFunction(x){
if(x=='\n'){return x='<br>';}
if(x==' '){return x=' ';}
if(x=='car'){return x='BMW'}
else{return x;}//must need
});
document.getElementById("demo").innerHTML = res;
}
</script>
</body>
</html>
Mit meinem replace-once -Paket können Sie Folgendes tun:
const replaceOnce = require('replace-once')
var str = 'I have a cat, a dog, and a goat.'
var find = ['cat', 'dog', 'goat']
var replace = ['dog', 'goat', 'cat']
replaceOnce(str, find, replace, 'gi')
//=> 'I have a dog, a goat, and a cat.'
Ich habe dieses npm-Paket stringinject https://www.npmjs.com/package/stringinject geschrieben, mit dem Sie Folgendes tun können
var string = stringInject("this is a {0} string for {1}", ["test", "stringInject"]);
dadurch werden {0} und {1} durch die Arrayelemente ersetzt und die folgende Zeichenfolge zurückgegeben
"this is a test string for stringInject"
oder Sie könnten Platzhalter durch Objektschlüssel und Werte wie folgt ersetzen:
var str = stringInject("My username is {username} on {platform}", { username: "tjcafferkey", platform: "GitHub" });
"My username is tjcafferkey on Github"