it-swarm.com.de

Ersetzen Sie mehrere Zeichenfolgen durch mehrere andere Zeichenfolgen

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".
149
Anderson Green

Spezifische Lösung

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

jsfiddle Beispiel

Verallgemeinern

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.

Geige mit dynamischer Regex

Wiederverwendbar machen

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.

Geige mit Funktion

Um sicherzustellen, dass Object.keys in älteren Browsern funktioniert, fügen Sie eine Polyfill hinzu, z. B. aus MDN oder Es5 .

331
Ben McCormick

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'
6
Iian

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"
3
João Paulo

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,'}');
2
KARTHIKEYAN.A

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])
1
Quentin 2

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."
1
jack

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
1
Emmanuel N K
    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."
0
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/

0
nazih ahmed

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));
    });
});
0
Super Model
<!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='&nbsp';}
if(x=='car'){return x='BMW'}
else{return x;}//must need



});

    document.getElementById("demo").innerHTML = res;
}
</script>

</body>
</html>
0
Jalaluddin Rumi

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.'
0
Kodie Grantham

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" 
0
tjcafferkey