用正则表达式处理千分符的面试题(三种方案)
2015-06-08 16:31:03

280
重点综合示例:给数字加上千分符
比如:把12345修改成12,345,把1234567修改成1,234,567
var str="39736484599";//修改成39,736,484,599
第一种方案:
reg=/^(\d{1,3})((\d{3})+)$/;//这个正则的作用是把字符串分隔成两部分,前一部分是一到三位的数字,后边的数字个数是3的倍数。分解完成之后再进行处理。
var newStr=str.replace(reg,function(){
var part1=arguments[1];
var part2=arguments[2];
//part1是39
//part2是736484599,对part2进行二次处理,每三位数字加一个逗号,但最后一组不加(就是正则(?!$)的作用,它是负向预查,表示不能是右边界,即不给出现在右边界的字符串加逗号)
return part1+","+part2.replace(/\d{3}(?!$)/g,function(){
return arguments[0]+",";//每位加一个逗号
})
});
alert(newStr);
第二种方案:
这种方案正则简单,自定义替换规则函数里的逻辑稍稍复杂一点点
var reg=/\d(?!$)/g;//这个正则其实也就是起个数数的作用(记数)
newStr=str.replace(reg,function(){
if((arguments[2].length-arguments[1]-1)%3==0){
//if里的条件相当于在倒着数当前这个数是倒数第几个,如果数到的这个数是3的倍数,则加一个逗号
return arguments[0]+",";//加上一个逗号返回
}else{
return arguments[0];//把原来的字符再返回,一定要返回
}
//arguments[0]是正则捕获到的结果,arguments[1]是此结果在输入字符串中的位置,arguments[2]是指输入字符串
})
alert(newStr);
第三种方案
var str="39736484599";
//这是最直接的一种思路,就是先反转,再处理,最后再反转回来
var strTemp1=str.split("").reverse().join("");//反转
var strTemp2=strTemp1.replace(/(\d{3}(?!$))/g,"$1,");//按从左向右的顺序加逗号
//(?!$)负向预测:表示连续出现的三个字符的右边不能是最右边儿(不能是结尾)
var strTemp3=strTemp2.split("").reverse().join("");//再反转
alert(strTemp3);