现在有个金额数字,比如:123456789
用正则进行分位:/\B(?=(\d{3})+(?!\d))/
结果为:123,456,789
关于这条正则的匹配原理,按我的理解,思路如下:
也就是说:最后这个正则匹配到的位置应该6号位,但是实际结果却是,这个正则还同时匹配到了3号位,表示不理解
备注:蓝色序号表示\B的匹配结果
现在有个金额数字,比如:123456789
用正则进行分位:/\B(?=(\d{3})+(?!\d))/
结果为:123,456,789
关于这条正则的匹配原理,按我的理解,思路如下:
也就是说:最后这个正则匹配到的位置应该6号位,但是实际结果却是,这个正则还同时匹配到了3号位,表示不理解
备注:蓝色序号表示\B的匹配结果
首先B是非单词边界,包括单词和单词的中间,以及非单词和非单词、字符串首尾、多行模式下的行首行尾的中间。
您可以理解为B匹配了一个位置,这个位置表示不为单词边界的位置。(d{3})+表示至少连续出现3个数字一次或多次,?=表示断言,匹配到的位置。?=(d{3})+则表示至少出现3个数字一次的位置数,如果去掉B,则从3到9,可以可匹配数为7,加上B的话,是从4到9,匹配数为6
谢邀!
不过你忽略了最关键的 (?!\d)
它是表示向后搜索非数字结尾,换言之它帮忙做了一个限定作用,来保证后面必须是非数字的状态。
若按 \B(?=(\d{3})+)
来匹配的话,实则每一次匹配只要保证后三位是数字即可。
其实这个题,蛮能学习到正则匹配的一个很基础的执行情况,如果你把它的匹配到的 match
列印的话,会得到很奇怪的结果吧(我没有测试过,你可以试一下);比如:\B(?=(\d{3})+)
应该会得到一个大堆 567
、678
之类的,因为它匹配到的次数应该会在六次以上。倘若加上限定我想应该只会在二三次而且每一个的结果应该都是 789
。
把+
去掉才是你想要的结果
nodejs
> s='123456789'
> p=/\B(?=(\d{3})+)/g
> while(m=p.exec(s)){console.log(m);p.lastIndex++}
[ '', '567', index: 1, input: '123456789' ]
[ '', '678', index: 2, input: '123456789' ]
[ '', '789', index: 3, input: '123456789' ]
[ '', '567', index: 4, input: '123456789' ]
[ '', '678', index: 5, input: '123456789' ]
[ '', '789', index: 6, input: '123456789' ]
6
> p=/\B(?=(\d{3}))/g
> while(m=p.exec(s)){console.log(m);p.lastIndex++}
[ '', '234', index: 1, input: '123456789' ]
[ '', '345', index: 2, input: '123456789' ]
[ '', '456', index: 3, input: '123456789' ]
[ '', '567', index: 4, input: '123456789' ]
[ '', '678', index: 5, input: '123456789' ]
[ '', '789', index: 6, input: '123456789' ]
6
>
可以优化为:/\B(?=(?:\d{3})+$)/g
(?:\d{3})+$
表示当前位置后有3的整数倍个数字
> s='123456789'
> p=/\B(?=(\d{3})+(?!\d))/g
> while(m=p.exec(s)){console.log(m);p.lastIndex++}
[ '', '789', index: 3, input: '123456789' ]
[ '', '789', index: 6, input: '123456789' ]
6
> s.replace(p,',')
'123,456,789'
> p=/\B(?=(?:\d{3})+$)/g
> while(m=p.exec(s)){console.log(m);p.lastIndex++}
[ '', index: 3, input: '123456789' ]
[ '', index: 6, input: '123456789' ]
6
> s.replace(p,',')
'123,456,789'
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
你3后面有6个数,也是三的倍数啊,为什么不匹配