特定のソリューション
関数を使用して、それぞれを置き換えることができます。
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の例
それを一般化する
正規表現を動的に維持し、将来の交換をマップに追加するだけの場合は、これを行うことができます
new RegExp(Object.keys(mapObj).join("|"),"gi");
正規表現を生成します。だからそれはこのようになります
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];
});
さらに置換を追加または変更するには、マップを編集するだけです。
動的正規表現をいじる
再利用可能にする
これを一般的なパターンにしたい場合は、これを次のような関数に引き出すことができます
function replaceAll(str,mapObj){
var re = new RegExp(Object.keys(mapObj).join("|"),"gi");
return str.replace(re, function(matched){
return mapObj[matched.toLowerCase()];
});
}
したがって、strと必要な置換のマップを関数に渡すだけで、変換された文字列が返されます。
機能をいじる
Object.keysが古いブラウザで機能するようにするには、MDNやEs5などからのポリフィルを追加します。