我有一个JS字符串需要替换它的几个字符。
例如,输入字符串:
s = 'ABAC'
我想用B
替换所有C
s,反之亦然。但是,执行标准的正则表达式替换是不够好的,因为replace()
s不应该以锁步方式发生,而是在字符串上单次传递。
>>> s.replace(/B/g, 'C').replace(/C/g, 'B')
'ABAB' // not good
是否有一种优雅的方法可以在一次传递中执行多个字符串replace()
?
(解决方案必须适用于任意替换char)
答案 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仍然可以被识别。