本帖最后由 xhawk18 于 2012-07-23 23:20:34 编辑

解决方案 »

  1.   

    <script type="text/javascript">
    var reg=/([a-z]+)|([0-9]+)|([A-Z]+)/g;
    var tests="abbc0123AZ0";
    var t=tests.match(reg);
    for(var i=0;i<t.length;i++){
    var reg=/([a-z]+)|([0-9]+)|([A-Z]+)/g;
    reg.test(t[i]);
    alert(RegExp.$1+":"+RegExp.$2+":"+RegExp.$3);
    if(RegExp.$1){
    t[i]=1;
    }else if(RegExp.$2){
    t[i]=2;
    }else if(RegExp.$3){
    t[i]=3;
    }
    }
    alert(t.join(""));
    </script>
    感觉只能逐个匹配啊  等高手吧
      

  2.   


    <script language="JavaScript">
    var regarr=[/a/g,/b/g,/c/g,/d/g];
    var str="absdbuiqiownaasdssdn";
    for(var i=0;i<regarr.length;i++){
    str=str.replace(regarr[i],i+1);
    }
    alert(str);
    </script>
      

  3.   

    抛砖引玉一下。如果正则匹配的是确定的一个字符串,
    这个问题已经有答案了。现在的难处在于,类似2楼这样的,不确定的字符串,如何做:
    var reg=/([a-z]+)|([0-9]+)|([A-Z]+)/g;确定匹配字符串的例子:
    var reg = /tom|jerry|kate/g;
    var map = {
    'tom': 'abcd',
    'jerry': '1234',
    'kate': 'csdn'
    };var text = "tom and jerry and kate".replace(reg, function(s){
    return map[s];
    });alert(text);
      

  4.   


    var s='abcsds3sdf223   23 a 2d 4 d 5s 7dsa';
    alert(s.replace(/([a-z])/g,function(s,s1,i){return s1.charCodeAt(0)-96+''}));
      

  5.   

    正则表达式一般不支持你说的这种功能,(但 Perl 支持)一般碰到这种问题时,自己完成匹配循环:    while (/a|b|c|d|e/g) {
            ...
        }或    Matcher m = pattern.matcher("string");
        while (m.find()) {
            ...
        }(JavaScript 类似的方法)这样在 while 里面包括每次匹配的部分,这个部分可以用查找表之类替换:    while .. {
            item = map.get(item);
        }最后,把“未匹配到的部分“连起来:    replacement = "";
        offset = 0;
        
        while .. {
            replacement += s.substring(offset, matchBegin);
            replacement += map.get(item);
            offset = matchEnd;
        }    replacement += s.substring(matchBegin);
      

  6.   

    不好意思,第一次没好好审题,给个思路://    ra=/a/g,    rb=/b/g,    rc=/c/g,    rd=/1/g 假定所有正则表达式为这些
    //    sa='1',     sb='2',     sc='3',     sd='1a' 假定对应要替换的字符串为这些
    //生成一个Map,以正则表达式的源文本为key,对应的字符串为value。获取一个正则表达式的源文本用reg.source方法获取。
    var regMap={
       'a':'1',
       'b':'2',
       'c':'3',
       '1':'1a'
    },regs=[],tmp=false;//regs是最终正则表达式
    regs.push('(');
    for(var p in regMap){
        if(regMap.hasOwnProperty(p)){
            if(tmp)regs.push('|');
            regs.push(p);
            tmp=true
        }
    }
    regs.push(')');
    regs=new RegExp(regs.join(''),'g');var s='abc1xdsk a o c d 1 z';
    alert(s.replace(regs,function(s,s1){return regMap[s1]}))以上代码要求所有正则表达式的匹配模式一致,要么都为'g',要么都为'gi',或者都为'i'
      

  7.   


    对于这样不确定匹配文本的正则呢?/([a-z]+)|([0-9]+)|([A-Z]+)/g;有没好的办法?
      

  8.   

    感觉6楼说的对
    即便是固定的字符串  类似于
    var reg = /tom|jerry|kate/g;
    var map = {
        'tom': 'abcd',
        'jerry': '1234',
        'kate': 'csdn'
    };var text = "tom and jerry and kate".replace(reg, function(s){
        return map[s];
    });alert(text);
    他也是逐个匹配的 这个可以看下正则的匹配方式
      

  9.   

    还没好办法今天测试了下一次性正则和逐个用正则的效率,
    对比下,发现 ff, chrome, opera,都是一次性效率较高,
    效率相差近一倍。
    IE则正好相反。万恶的IE.var map = {
    'tom0': 'abcd',
    'jerry0': '1234',
    'kate0': 'csdn',
    'tom1': 'abcd',
    'jerry1': '1234',
    'kate1': 'csdn',
    'tom2': 'abcd',
    'jerry2': '1234',
    'kate2': 'csdn',
    'tom3': 'abcd',
    'jerry3': '1234',
    'kate3': 'csdn',
    'tom4': 'abcd',
    'jerry4': '1234',
    'kate4': 'csdn',
    'tom5': 'abcd',
    'jerry5': '1234',
    'kate5': 'csdn',
    'tom6': 'abcd',
    'jerry6': '1234',
    'kate6': 'csdn',
    'tom7': 'abcd',
    'jerry7': '1234',
    'kate7': 'csdn'
    };var d = new Date();
    var s = '';
    for(var i = 0; i < 100000; ++i){
    var text = "tom0 and jerry1 and kate2 tom1 and jerry2 and kate0 tom2 and jerry0 and kate1 tom3 and jerry3 and kate3";

    s = s.substr(0,1) + 
    text.replace(/tom0|jerry0|kate0|tom1|jerry1|kate1|tom2|jerry2|kate2|tom3|jerry3|kate3|tom4|jerry4|kate4|tom5|jerry5|kate5|tom6|jerry6|kate6|tom7|jerry7|kate7/g, function(k){
    return map[k];
    });
    }
    alert(new Date() - d + '\n'+s);
    var d = new Date();
    var s = '';
    for(var i = 0; i < 100000; ++i){
    var text = "tom0 and jerry1 and kate2 tom1 and jerry2 and kate0 tom2 and jerry0 and kate1 tom3 and jerry3 and kate3";

    s = s.substr(0,1) +
    text.replace(/tom0/g, "abcd")
    .replace(/jerry0/g, "1234")
    .replace(/kate0/g, "csdn")
    .replace(/tom1/g, "abcd")
    .replace(/jerry1/g, "1234")
    .replace(/kate1/g, "csdn")
    .replace(/tom2/g, "abcd")
    .replace(/jerry2/g, "1234")
    .replace(/kate2/g, "csdn")
    .replace(/tom3/g, "abcd")
    .replace(/jerry3/g, "1234")
    .replace(/kate3/g, "csdn")
    .replace(/tom4/g, "abcd")
    .replace(/jerry4/g, "1234")
    .replace(/kate4/g, "csdn")
    .replace(/tom5/g, "abcd")
    .replace(/jerry5/g, "1234")
    .replace(/kate5/g, "csdn")
    .replace(/tom6/g, "abcd")
    .replace(/jerry6/g, "1234")
    .replace(/kate6/g, "csdn")
    .replace(/tom7/g, "abcd")
    .replace(/jerry7/g, "1234")
    .replace(/kate7/g, "csdn")
    }
    alert(new Date() - d + '\n'+s);
      

  10.   

    @xhawk18  假设 text 长度为 n,有 m 个替换模式,模式平均复杂度为 s,直觉上“一次”替换的复杂度为 O(n * s),“逐次”替换是 O(n * s * m)你这个测试中的 m, s 都太小,之所以你的结果中 IE 不符合期望,大概是因为 O(s*m) 还没有超过"构造一个具有运行时求值能力的状态机“的基本开销 的缘故吧。
      

  11.   

    /tom0|jerry0|kate0|tom1|jerry1|kate1|tom2|jerry2|kate2|tom3|jerry3|kate3|tom4|jerry4|kate4|tom5|jerry5|kate5|tom6|jerry6|kate6|tom7|jerry7|kate7/也可能这个模式没有被 IE 简化,用 /\w+/g 试试。function 中 return map[k] == null ? k : map[k].