一个添加千分位分隔符的正则

  • 2018-06-13
  • 182

在只使用正则的情况下,把一个整数用千分位分隔符(半角逗号)分隔,如
原始字符:

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,')