我正在做类似的事情:
var a = "This is an A B pattern: ABABA";
a.replace("A", "B");
a.replace("B", "A");
让它返回:
=> “这是B A模式:BABAB”
而不是:
=> “这是A A模式:AAAAA”
我的第一个想法是做一些事情:
a.replace("A", "improbablePattern");
a.replace("B", "A");
a.replace("improbablePattern", "B");
我该怎么做?
答案 0 :(得分:2)
您可以使用与两者匹配的正则表达式将函数传递给.replace()
调用,如下所示:
var a = "This is an A B pattern: ABABA";
a = a.replace(/(A|B)/g, function(a, m) { return m == "A" ? "B" : "A"; });
alert(a); //alerts "This is an B A pattern: BABAB"
答案 1 :(得分:1)
您需要立即进行所有替换。你可以使用这样的东西来做到这一点:
String.prototype.translate = function(translation) {
var names = [];
for (var search in translation) {
if (translation.hasOwnProperty(search)) {
names.push(search.replace(/([.\\+*?[^\]$(){}=!<>|:\-])/g, "\\$1"));
}
}
var re = new RegExp("(?:" + names.join("|") + ")", "g");
return this.replace(re, function(val) { return translation[val]; });
}
var text = "This is an A B pattern: ABABA",
translation = {
"A": "B",
"B": "A"
};
text = text.translate(translation);
此处translation
是从旧值到新值的映射。在字符串上使用此处定义的translate
方法进行转换。传递的translation
对象的属性名称用于构建(?:name1|name2|…|nameN)
形式的正则表达式。然后使用该正则表达式进行替换,同时使用附加函数返回与匹配值对应的新值。
答案 2 :(得分:0)
这不是正则表达式适合的东西。无论你如何转动它,你至少需要三个单独的替换操作,这意味着编译和执行三个正则表达式,并找到一个可证明的非碰撞模式的中间替换是一个麻烦。不,在这种情况下,你应该自己拆开字符串并一次性翻译你想要的所有字符。更加有效和合理。
(也就是说,除非Javascript有一些我不知道的类似Perl的tr
运算符。)