Estoy tratando de reemplazar varias palabras en una cadena con varias 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 varias cadenas con varias cadenas 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".
Respuestas:
Solución especifica
Puede usar una función para reemplazar cada una.
Ejemplo de jsfiddle
Generalizándolo
Si desea mantener dinámicamente la expresión regular y solo agregar futuros intercambios al mapa, puede hacerlo
para generar la expresión regular. Entonces se vería así
Y para agregar o cambiar más reemplazos, puede editar el mapa.
violín con regex dinámico
Haciéndolo reutilizable
Si desea que este sea un patrón general, puede llevarlo a una función como esta
Entonces, podría pasar la cadena y un mapa de los reemplazos que desea a la función y devolvería la cadena transformada.
violín con función
Para garantizar que Object.keys funcione en navegadores antiguos, agregue un polyfill, por ejemplo, de MDN o Es5 .
fuente
.
notación con todas esas propiedades. La notación de corchetes funciona con cualquier cadena.map={'.': ',', ',': '.'}
y regex/\.|,/g
.return mapObj[matched.toLowerCase()];
soloreturn mapObj[matched];
porque uso mayúsculas y minúsculasmapObj
.Object.keys(mapObj).map(key => key.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')).join('|')
. Inspirado por esta respuestaEs posible que esto no satisfaga su necesidad exacta en este caso, pero he encontrado que 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 haga referencia a ellos:
Lo invocarías de la siguiente manera:
fuente
Use elementos numerados para evitar reemplazarlos nuevamente. p.ej
luego
Cómo funciona: -% \ d + encuentra los números que vienen después de un%. Los corchetes capturan el número.
Este número (como una cadena) es el segundo parámetro, n, de la función lambda.
El + n-1 convierte la cadena en el número y luego se resta 1 para indexar la matriz de mascotas.
El número% se reemplaza con la cadena en el índice de la matriz.
El / g hace que la función lambda se llame repetidamente con cada número que luego se reemplaza con una cadena de la matriz.
En JavaScript moderno: -
fuente
Esto funcionó para mí:
fuente
utilizando Array.prototype.reduce () :
Ejemplo
fuente
${f}
lugar de f para el valor acumulado?${f}
.replace (new RegExp (Object.keys (s) [ 0], 'g'), s [Object.keys (s) [0]]), oración1) "En caso de que alguien se pregunte por qué la solución del póster original no funciona:
fuente
función regular del usuario para definir el patrón a reemplazar y luego usar la función de reemplazo para trabajar en la cadena de entrada,
fuente
RegExp
objeto podría resolver el problemavar i = new RegExp('}','g'), j = new RegExp('{','g'), k = data.replace(i,'{').replace(j,'}');
Con mi paquete replace-once , puede hacer lo siguiente:
fuente
fuente
Puede buscar y reemplazar cadenas con delimitadores.
fuente
/ * replaceSome método para cadenas que toma tantos argumentos como queramos y los reemplaza todos con el último argumento que especificamos 2013 CopyRights guardado para: Max Ahmed este es un ejemplo:
* /
jsFiddle: http://jsfiddle.net/CPj89/
fuente
fuente
Escribí este paquete npm stringinject https://www.npmjs.com/package/stringinject que le permite hacer lo siguiente
que reemplazará {0} y {1} con los elementos de la matriz y devolverá la siguiente cadena
o podría reemplazar marcadores de posición con claves de objeto y valores de esta manera:
fuente
Puede usar https://www.npmjs.com/package/union-replacer para este propósito. Básicamente es una
string.replace(regexp, ...)
contraparte, lo que permite que sucedan múltiples reemplazos en una sola pasada, al tiempo que conserva la potencia total destring.replace(...)
.Divulgación: soy el autor. La biblioteca se desarrolló para admitir reemplazos configurables por el usuario más complejos y aborda todas las cosas problemáticas como grupos de captura, referencias inversas y reemplazos de funciones de devolución de llamada.
Sin embargo, las soluciones anteriores son lo suficientemente buenas para el reemplazo exacto de cadenas.
fuente
Me expandí un poco en @BenMcCormicks. Trabajó para cadenas regulares, pero no si hubiera escapado de personajes o comodines. Esto es lo que hice.
devuelve "bla bla 234433 bla bla"
De esta forma, coincidirá con la clave en mapObj y no con la palabra coincidente '
fuente
Solución con Jquery (primero incluya este archivo): reemplace varias cadenas con varias otras cadenas:
fuente
javascript tag added in question, and jquery is a libarary of javascript.
Hmmm, esa lógica está desactivada, debería ser al revés, y también solo un aviso: desde la información de la etiqueta de JavaScript: " A menos que también se incluya otra etiqueta para un marco / biblioteca, se espera una respuesta de JavaScript pura " .