用于替换字符串中不同字符的函数

时间:2013-06-05 06:53:39

标签: javascript regex

我正在尝试编写一个替换字符串中某些字符的javascript函数。例如,如果我想在字符串“a b”中将“a”替换为“ab”而将“b”替换为“c”,则该函数应该为我提供字符串“ab c”。在这种情况下,我不能先在字符串上用'a'替换,然后在结果上用'b'替换另一个,因为这会给我“ac b”而不是“ab c”。

关于如何有效地做到这一点的任何想法?

3 个答案:

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

正确的解决方案:正则表达式。 “缺点”是难以学习,(但一旦你学会了,这是完全值得的。)

“快速”解决方案是:

  1. 用非常不寻常的东西(“唯一”)替换a 且不得包含“b”
  2. 用你想要的任何东西替换b
  3. 用ab
  4. 替换极不寻常的 像这样

    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