珠峰培训

用正则表达式处理千分符的面试题(三种方案)

作者:

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);