我正在尝试编写一个替换字符串中某些字符的javascript函数。例如,如果我想在字符串“a b”中将“a”替换为“ab”而将“b”替换为“c”,则该函数应该为我提供字符串“ab c”。在这种情况下,我不能先在字符串上用'a'替换,然后在结果上用'b'替换另一个,因为这会给我“ac b”而不是“ab c”。
关于如何有效地做到这一点的任何想法?
答案 0 :(得分:5)
您可以使用正则表达式来匹配不同的字符,并使用回调函数来确定要替换它的内容。由于它在一次运行中完成所有替换,因此一个替换包含另一个要替换的东西没有问题:
s = s.replace(/[ab]/g, function(m){
switch (m) {
case 'a': return 'ab';
case 'b': return 'c';
}
return m;
});
演示:http://jsfiddle.net/Guffa/pXSM5/
使用正则表达式匹配每个字符串,循环遍历它们并查找每个匹配项,然后遍历找到的匹配项并替换它们。最简单的方法是从字符串中的最后一个开始进行替换,这样当替换的长度与匹配的字符串不同时,您不必调整其他匹配的索引:
var s = "a b";
var re = [{ regex: /a/g, replace: 'ab'}, { regex: /b/g, replace: 'c' }];
var pos = [];
for (var i = 0; i < re.length; i++) {
while ((r = re[i].regex.exec(s)) != null) {
pos.push({ index: r.index, match: r[0], replace: re[i].replace });
}
}
while (pos.length > 0) {
var last = 0;
for (var i = 0; i < pos.length; i++) {
if (pos[i].index > pos[last].index) last = i;
}
var p = pos[last];
s = s.substr(0, p.index) + p.replace + s.substr(p.index + p.match.length);
pos.splice(last, 1);
}
演示:http://jsfiddle.net/Guffa/pXSM5/1/
注意:确保正则表达式与可能重叠的任何内容都不匹配。
答案 1 :(得分:0)
正确的解决方案:正则表达式。 “缺点”是难以学习,(但一旦你学会了,这是完全值得的。)
“快速”解决方案是:
a -> <my_unique_replacement_which_does_not_contain_the_letter_____you_know!>
b -> c
<my_unique_replacement_which_does_not_contain_the_letter_____you_know!> -> ab
它不能保证,它不是一个100%的解决方案,可以在任何地方使用,但快速解决限制使用。
答案 2 :(得分:0)
我使用数组拆分制作了小代码并替换
var s = "a b ba c",
re = [['a','ab'], ['b','c'], ['c','d']] ;
var replaced = s.split('').map( function( v ){
var found = false,
once = function( c ){
return function( v ){
return found? v: ( found = true && c ) ;
}
};
return re.reduce( function ( a, p ){
return a.replace( p[0], once( p[1]) );
}, v );
}).join('');
console.log( replaced );
和replaced
输出ab c cab d