千位分隔符插入位置匹配正则表达式逐字符解析请求
正则表达式
(?<=\d)(?=(\d\d\d)+(?!\d))解析与匹配逻辑 一、逐字符拆解正则
(?<=\d):后行断言(正向反向预查),要求当前位置左边必须是一个数字,直接排除了数字串最开头的位置(毕竟千位分隔符不会加在数字最前面)。(?=):先行断言(正向预查),要求当前位置右边必须符合括号里的规则,这是整个正则的核心:(\d\d\d)+:匹配1次或多次“连续三个数字”的组合,\d\d\d就是任意三个数字,+表示这种组合至少得出现一次。(?!\d):负先行断言,要求前面的(\d\d\d)+匹配完之后,右边不能再有数字——说白了就是,从当前位置往后的所有数字,必须能刚好分成若干组三个数字,直到整个数字串的末尾。
二、在数字1234567中的匹配逻辑
先把数字的潜在分隔位置标出来:1 | 2 | 3 | 4 | 5 | 6 | 7(|代表可能插逗号的地方)
逐个看每个位置:
- 第一个
|(1和2之间):- 左边是数字
1,符合(?<=\d)的要求; - 右边是
234567,一共6个数字,刚好能分成2组三个数字(234和567),而且最后一组567后面没有数字,完全符合(?=(\d\d\d)+(?!\d))。所以这个位置匹配,要插逗号。
- 左边是数字
- 第二个
|(2和3之间):- 左边是数字
2,满足(?<=\d); - 右边是
34567,一共5个数字,只能分出1组345,剩下67不够三个,没法凑成完整的三组直到末尾,所以不满足条件,不匹配。
- 左边是数字
- 第三个
|(3和4之间):- 左边是数字
3,满足(?<=\d); - 右边是
4567,4个数字,分出一组456后剩1个7,同样没法凑到末尾都是三组,不匹配。
- 左边是数字
- 第四个
|(4和5之间):- 左边是数字
4,满足(?<=\d); - 右边是
567,刚好一组三个数字,后面也没有数字了,符合要求,所以这个位置也匹配,要插逗号。
- 左边是数字
- 第五、六个
|(5和6之间、6和7之间):- 右边剩下的数字分别是2个和1个,连一组三个数字都凑不齐,自然不满足条件,不匹配。
最终匹配到两个位置,插完逗号就变成1,234,567。
内容的提问来源于stack exchange,提问作者Peter Awonusonu
相关产品推荐
相关产品推荐

