Soluzione specifica
È possibile utilizzare una funzione per sostituire ciascuna.
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];
});
esempio jsfiddle
Generalizzandolo
Se vuoi mantenere dinamicamente la regex e semplicemente aggiungere futuri scambi alla mappa, puoi farlo
new RegExp(Object.keys(mapObj).join("|"),"gi");
per generare la regex. Quindi sarebbe così
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];
});
E per aggiungere o modificare altri rimpiazzi puoi semplicemente modificare la mappa.
violino con regex dinamico
Rendendolo riutilizzabile
Se vuoi che questo sia un modello generale, puoi estrarlo a una funzione come questa
function replaceAll(str,mapObj){
var re = new RegExp(Object.keys(mapObj).join("|"),"gi");
return str.replace(re, function(matched){
return mapObj[matched.toLowerCase()];
});
}
Quindi potresti semplicemente passare la str e una mappa delle sostituzioni che vuoi alla funzione e restituirebbe la stringa trasformata.
violino con funzione
Per assicurarsi che Object.keys funzioni nei browser meno recenti, aggiungere un polyfill, ad esempio da MDN o Es5 .