在JavaScript / jQuery中替换优雅的多个char

时间:2012-03-02 15:08:13

标签: javascript jquery regex

我有一个JS字符串需要替换它的几个字符。

例如,输入字符串:

s = 'ABAC'

我想用B替换所有C s,反之亦然。但是,执行标准的正则表达式替换是不够好的,因为replace() s不应该以锁步方式发生,而是在字符串上单次传递。

>>> s.replace(/B/g, 'C').replace(/C/g, 'B')
'ABAB' // not good

是否有一种优雅的方法可以在一次传递中执行多个字符串replace()

(解决方案必须适用于任意替换char)

3 个答案:

答案 0 :(得分:9)

var str = 'ABACACCBA',
    out = str.replace(/[CB]/g, function(c) {
        return {
            "B" : "C",
            "C" : "B"
        }[c];
    });

console.log(out);  /* ACABABBCA */

您所要做的就是定义要匹配的所有字符,然后定义具有交换规则的对象。也可以用这种方式替代

var str = 'ABACACCBA',
    out = str.replace(/\w/g, function(c) {
        return {
            "B" : "C",
            "C" : "B"
        }[c] || c;
    });

console.log(out);  /* ACABABBCA */

在本例中,您为匹配的每个字符执行函数,但只有在您定义了对象的条目(否则返回原始字符)时才进行交换。

显然更昂贵(因此最好使用第一个示例)但在这种情况下,您可以避免在正则表达式中列出要匹配的所有字符。

答案 1 :(得分:0)

您需要translate个功能;有关示例实现,请参阅this question

答案 2 :(得分:0)

可能有更简洁的方法,但我通常做这样简单的事情......

s.replace(/B/g, '##_B_##').replace(/C/g, 'B').replace(/##_B_##/g, 'C');

基本上,在用B替换C之前使Bs唯一,这样原始B仍然可以被识别。