在Regex / Javascript中交换另一个角色

时间:2010-10-10 20:25:13

标签: javascript regex

我正在做类似的事情:

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");  

我该怎么做?

3 个答案:

答案 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"

You can try it out here

答案 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运算符。)