quitar - reemplazar caracteres javascript
Reemplazar cadenas mĂșltiples con varias otras cadenas (12)
Estoy tratando de reemplazar varias palabras en una cadena con muchas otras palabras. La cadena es "Tengo un gato, un perro y una cabra".
Sin embargo, esto no produce "Tengo un perro, una cabra y un gato", sino que produce "Tengo un gato, un gato y un gato". ¿Es posible reemplazar cadenas múltiples con otras cadenas múltiples al mismo tiempo en JavaScript, para que se produzca el resultado correcto?
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".
Solución específica
Puede usar una función para reemplazar cada uno.
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];
});
Generalizándolo
Si desea mantener dinámicamente la expresión regular y simplemente agregar intercambios futuros al mapa, puede hacer esto
new RegExp(Object.keys(mapObj).join("|"),"gi");
para generar la expresión regular Entonces, se vería así
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];
});
Y para agregar o cambiar más reemplazos, simplemente podría editar el mapa.
violín con expresiones regulares dinámicas
Haciéndolo reutilizable
Si quieres que esto sea un patrón general, puedes sacar esto a una función como esta
function replaceAll(str,mapObj){
var re = new RegExp(Object.keys(mapObj).join("|"),"gi");
return str.replace(re, function(matched){
return mapObj[matched.toLowerCase()];
});
}
Entonces podrías pasar la str y un mapa de los reemplazos que quieras a la función y devolvería la cadena transformada.
Para asegurarse de que Object.keys funcione en navegadores más antiguos, agregue un polyfill, por ejemplo, de MDN o Es5 .
Con mi paquete de replace-once , podrías hacer lo siguiente:
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.''
En caso de que alguien se pregunte por qué la solución del póster original no funciona:
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."
Escribí este paquete npm stringinject https://www.npmjs.com/package/stringinject que le permite hacer lo siguiente
var string = stringInject("this is a {0} string for {1}", ["test", "stringInject"]);
que reemplazará el {0} y {1} con los elementos de la matriz y devolverá la siguiente cadena
"this is a test string for stringInject"
o puede reemplazar los marcadores de posición con claves y valores de objeto de esta manera:
var str = stringInject("My username is {username} on {platform}", { username: "tjcafferkey", platform: "GitHub" });
"My username is tjcafferkey on Github"
Esto funcionó para mí:
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"
Esto puede no satisfacer su necesidad exacta en este caso, pero he encontrado que esta es una forma útil de reemplazar múltiples parámetros en cadenas, como una solución general. Reemplazará todas las instancias de los parámetros, sin importar cuántas veces se mencionen:
String.prototype.fmt = function (hash) {
var string = this, key; for (key in hash) string = string.replace(new RegExp(''//{'' + key + ''//}'', ''gm''), hash[key]); return string
}
Lo invocaría de la siguiente manera:
var person = ''{title} {first} {last}''.fmt({ title: ''Agent'', first: ''Jack'', last: ''Bauer'' });
// person = ''Agent Jack Bauer''
Expandí un poco en @BenMcCormicks. Trabajaba para cadenas regulares, pero no si había escapado de personajes o comodines. Esto es lo que hice
str = "[curl] 6: blah blah 234433 blah blah";
mapObj = {''//[curl] *'': '''', ''//d: *'': ''''};
function replaceAll (str, mapObj) {
var arr = Object.keys(mapObj),
re;
$.each(arr, function (key, value) {
re = new RegExp(value, "g");
str = str.replace(re, function (matched) {
return mapObj[value];
});
});
return str;
}
replaceAll(str, mapObj)
regresa "blah blah 234433 blah blah"
De esta forma, coincidirá con la clave en mapObj y no con la palabra coincidente ''
Use elementos numerados para evitar el reemplazo de nuevo. p.ej
let str = "I have a %1, a %2, and a %3";
let pets = ["dog","cat", "goat"];
entonces
str.replace(/%(/d+)/g, (_, n) => pets[+n-1])
Uso de Jquery Reemplazar múltiples cadenas con múltiples otras cadenas
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));
});
});
función regular del usuario para definir el patrón a reemplazar y luego usar la función reemplazar para trabajar en la cadena de entrada,
var i = new RegExp(''"{'',''g''),
j = new RegExp(''}"'',''g''),
k = data.replace(i,''{'').replace(j,''}'');
<!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>
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 método para cadenas toma como, muchos argumentos como queremos y reemplaza a todos con el último argumento que especificamos 2013 CopyRights guardado para: Max Ahmed este es un ejemplo:
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/