高分求一去重复数字串正则表达式,在线等;请高手帮忙;问题:一小数或者整数,比如-0.233641464278
去(小数点 、负号、有效数字前的0);
返回指定长度(0-5)的不重复的字符串,原串顺序不变,比如长度为4,那么返回的串应该是'2364'。要求:必须要正则表达式来实现,不允许使用循环;返回最长长度为5.若函数为
function dN(num,len){
  return (处理后的num字符串,长度为len)
} 则    dN(-0.303545,3)='305';
     dN(33766545,4)='3765';再强调,要求高效率执行,不要循环,尽量用正则表达式。

解决方案 »

  1.   

    我的意思是不用循环语句(for,while等)来实现,直接用正则表达式实现
      

  2.   

    我这个还是用了循环
    function dN(num, len){
    return num.toString().replace(/-?0?\.0*/, "").replace(/\d/g, function(a){
    return arguments[2].substr(0, arguments[1]).indexOf(arguments[0]) >= 0 ? '' : arguments[0];
    }).substr(0, len);
    }alert(dN(-0.03454114560776, 5));
      

  3.   

    这个效率要好点...
    function dN(num, len){
    var d = 0;
    return num.toString().replace(/-?0?\.0*/, "").replace(/\d/g, function(v, i, s){
    return i-d > len ? '' : (s.substr(0, i).indexOf(v) >= 0 ? (d++,'') : v);
    }).substr(0, len);
    }alert(dN(-0.303333351211745764444444444444444,5));
      

  4.   


    <script type="text/javascript">
    <!--
    var nstr = "";
    function dN(num,len){ 
    num.toString().replace(/-|0(?=\.)|\./g,function(){return arguments[3];}).replace(/\d/g, function(){
    (nstr.indexOf(arguments[0]) == -1) && (nstr += arguments[0])
    })
    return nstr.substring(0,len)
    } alert(dN(-0.233641464278, 5))
    //-->
    </script>
      

  5.   

    再优化了一下, 不知道用哈希效率怎么样,  期待高手出现.
    function dN(num, len){
    var d = 0;
    return num.toString().replace(/-?0?\.0*/, "").replace(/\d/g, function(v, i, s){
    return i-d >= len ? '' : (s.indexOf(v) < i ? (d++,'') : v);
    });
    }alert(dN(-0.303333351211745764444444444444444,5));
      

  6.   

    试试看:
    <script type="text/javascript">var dN = function(num,len){
        var s = num.toString().replace(/(?:^[^\d]*0*|[^\d])*/g,'').split('').reverse().join('').replace(/(\d)(?=.*\1)/g,'').split('').reverse();
        s.length =len;
        return s.slice(0).join('');
    };alert(dN(-0.233641464278,4));
    alert(dN(-0.303545,3));
    alert(dN(33766545,4));</script>
      

  7.   

    正则效率并不会比直接循环更快,只是开发效率快而已。正则自身也是需要循环来判断的。试试这个:
    function dN(num, len){
    num = num.toString().replace(/^0+|\D+/g, "");
    var dict = {};
    var result = 0;
    for (var i = 0; len > 0 && i < num.length; i++) {
    var c = num.charAt(i);
    if (!dict[c]) {
    result *= 10;
    result += parseInt(c);
    len--;
    dict[c] = true;
    }
    }
    return result.toString();
    }alert(dN("0.123153422", 6));
      

  8.   

    num = num.toString().replace(/^0+(\.0+)?|\D+/g, "");考虑到这类情况:
    alert(dN("0.0123153678422", 2));[/code]
      

  9.   

    我来对执行效率排个名
    在我模拟我程序应用中(ie6.0)的环境,表现最好的是 Free_Wind22 ,执行时间为 1250ms;再次感谢你的2次改进。
    function dN2(num, len){
        var d = 0;
        return (num+'').replace(/-?0?\.0*/, "").replace(/\d/g, function(v, i, s){
            return i-d > len ? '' : (s.substr(0, i).indexOf(v) >= 0 ? (d++,'') : v);
        }).substr(0, len);
    }其次为dh20156,速度随变量的长度增大而变化明显。执行时间在 1550-2220之间;感谢;var dN3 = function(num,len){
        var s = num.toString().replace(/(?:^[^\d]*0*|[^\d])*/g,'').split('').reverse().join('').replace(/(\d)(?=.*\1)/g,'').split('').reverse();
        s.length =len;
        return s.slice(0).join('');
    };再次为s_liangchao1s,执行时间在 2900左右;感谢;
        function dN1(num,len){ 
        var nstr = "";
            num.toString().replace(/-|0(?=\.)|\./g,function(){return arguments[3];}).replace(/\d/g, function(){
                (nstr.indexOf(arguments[0]) == -1) && (nstr += arguments[0])
            })
            return nstr.substring(0,len)
        }再次为zswang ,执行时间为4500左右
    function dN4(num, len){
        num = num.toString().replace(/^0+|\D+/g, "");
        var dict = {};
        var result = 0;
        for (var i = 0; len > 0 && i < num.length; i++) {
            var c = num.charAt(i);
            if (!dict[c]) {
                result *= 10;
                result += parseInt(c);
                len--;
                dict[c] = true;
            }
        }
        return result.toString();
    }一个小小的优化在一个大的运算量面前,效率差别非常明显;正则表达式在ie中执行速度优势明显!
    完美结贴。感谢各位的帮助,一定向你们学习,不断进步。再次特别感谢Free_Wind22 ;
      

  10.   

    必须补充一下。
    刚有点错误,再说明下,向zswang 道歉。zswang 这位兄弟的时间我弄错了,我给前面一位加在一起了,非常抱歉。
    你说的非常正确,你这个的执行效率也和Free_Wind22 优化后的函数效率相当。
    测试中用的 Free_Wind22 是
    function dN5(num, len){
        var d = 0;
        return num.toString().replace(/-?0?\.0*/, "").replace(/\d/g, function(v, i, s){
            return i-d >= len ? '' : (s.indexOf(v) < i ? (d++,'') : v);
        });
    }
    ,贴的时候贴错了。谢谢所有朋友捧场,再见。
      

  11.   

    自己还发现一个问题。
    int.toString()的速度比int+'' 要慢。
    int+'' 要快点。
      

  12.   

    function dN(num, len){
        var d = 0;
       return num.toString().replace(/-?0?\.0*/, "").replace(/(\d)(?:\1)*/g, function(v, i){
           return d==len?'':(++d,i);
        });
    };function dN(num, len){
        var d = 0;
       return num.toString().replace(/-?0?\.0*/, "").match(/(\d)(?!\1)+/g).slice(0,len).join("");
    };
      

  13.   


    function dN(num, len){
       return num.toString().replace(/-?0?\.0*/, "").match(/(?:\d)(?!\1)+/g).slice(0,len).join("");
    }
    改为非捕获