高分求一去重复数字串正则表达式,在线等;请高手帮忙;问题:一小数或者整数,比如-0.233641464278
去(小数点 、负号、有效数字前的0);
返回指定长度(0-5)的不重复的字符串,原串顺序不变,比如长度为4,那么返回的串应该是'2364'。要求:必须要正则表达式来实现,不允许使用循环;返回最长长度为5.若函数为
function dN(num,len){
return (处理后的num字符串,长度为len)
} 则 dN(-0.303545,3)='305';
dN(33766545,4)='3765';再强调,要求高效率执行,不要循环,尽量用正则表达式。
去(小数点 、负号、有效数字前的0);
返回指定长度(0-5)的不重复的字符串,原串顺序不变,比如长度为4,那么返回的串应该是'2364'。要求:必须要正则表达式来实现,不允许使用循环;返回最长长度为5.若函数为
function dN(num,len){
return (处理后的num字符串,长度为len)
} 则 dN(-0.303545,3)='305';
dN(33766545,4)='3765';再强调,要求高效率执行,不要循环,尽量用正则表达式。
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));
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));
<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>
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));
<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>
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));
alert(dN("0.0123153678422", 2));[/code]
在我模拟我程序应用中(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 ;
刚有点错误,再说明下,向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);
});
}
,贴的时候贴错了。谢谢所有朋友捧场,再见。
int.toString()的速度比int+'' 要慢。
int+'' 要快点。
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("");
};
function dN(num, len){
return num.toString().replace(/-?0?\.0*/, "").match(/(?:\d)(?!\1)+/g).slice(0,len).join("");
}
改为非捕获