2012-03-02 35 views
4

我有一个JS字符串需要几个字符替换。在JavaScript/jQuery中优雅的多重字符替换

例如,对于输入字符串:

s = 'ABAC' 

我想用C S和反之亦然,以取代所有B秒。然而,做一个标准的正则表达式替换是不够好的,因为replace()不应该以锁步形式出现,而应该在字符串上单次传递。

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

有一种优雅的方式做多串replace()在单次?

(解决方案必须为任意字符替换工作)

回答

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 */ 

也做在这个例子中,你执行了匹配的每个字符的功能,但只能交换,如果你定义一个进入的对象(否则你回到原来的角色) 。

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

+0

这太棒了。我不知道'replace()'接受函数。很好,谢谢! – 2012-03-02 15:22:35

0

你想要一个translate功能;有关示例实现,请参见this question

+0

不知道我理解那里给出的例子。无论如何,这似乎比我所需要的要复杂得多(见公认的答案)。可能对其他案例有用,谢谢。 – 2012-03-02 15:24:21

0

有可能是整洁的方式来做到这一点,但我通常做一些简单的像这样....

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

基本上,使烧烤为B更换前C唯一让原本BS可以仍然被识别。

+0

这对于任意替换不够好。您的解决方案需要构建字符替换的依赖关系图。不是一个优雅的解 – 2012-03-02 15:16:13

+0

我不知道s的内容,所以我不能建议任何更独特的使用。这是一个简单的方法,但我已经使用它很长一段时间,从来没有问题。希望你找到更好的东西:) – Archer 2012-03-02 15:17:59

+0

我在说这个解决方案不是通用的。当然,如果我只需要翻译'B <-> C',那么我可以做到这一点。关键是我不知道*先验*哪些字符我需要替换。 – 2012-03-02 15:20:00