在只使用正则的情况下,把一个整数用千分位分隔符(半角逗号)分隔,如
原始字符:
198123123123123
变为
198,123,123,123,123
分析:
– 从后往前每三个数字加一个逗号
– 如果恰好是3的倍数个数字,最前面不需要逗号
– 由于强制逗号后面必须跟3位数字,可能需要用到零宽断言找到符合条件的位置
思路:
– 1.可以找空白位置插入逗号
– 2.可以找空白位置的前一位,替换成该位数字+逗号
思路1、
1.找到所有后面接三位数字的位置,不消耗位置
/(?=\d{3})/g
2.这个位置后面的数字个数应该是3的倍数,也就是最终恰好匹配到结尾($)
/(?=(\d{3})+$)/g
3.这个位置不能是开始位置
/(?!^)(?=(\d{3})+$)/g
4.测试
'123123123123123123123123'.replace(/(?!^)(?=(\d{3})+$)/g,',')
'9123123123123123123123123'.replace(/(?!^)(?=(\d{3})+$)/g,',')
'99123123123123123123123123'.replace(/(?!^)(?=(\d{3})+$)/g,',')
思路2、
1.找到所有挨着的三个数字
/\d{3}/
2.重复匹配1中的结果,直到匹配最末尾的结束符($)
/X+$/ // X指代(1)中匹配的3个数字位
3.找到所有这样的位置,它的后面是(2)中找到的位置
/(?=X+$)/g // X指代(1)中匹配的3个数字位
4.这个位置的前面必须有一个数字(确保在数字位数是3的倍数的时候,不在最开始添加逗号),这个数字我们需要捕获
/(\d)(?=X+$)/g // X指代(1)中匹配的3个数字位
5.将X换回
/(\d)(?=(\d{3})+$)/g
6.测试
'123123123123123123123123'.replace(/(\d)(?=(?:\d{3})+$)/g,'$1,')
'9123123123123123123123123'.replace(/(\d)(?=(?:\d{3})+$)/g,'$1,')
'99123123123123123123123123'.replace(/(\d)(?=(?:\d{3})+$)/g,'$1,')