正则:将一串数字的每3个就用逗号分开的问题
高洛峰
高洛峰 2016-11-10 11:42:51
0
4
1203

'12334565632'.replace(/(\d)(?=(\d{3})+$)/g, "$1,");//结果:"12,334,565,632"

上边这个是网上找的,是可以实现的,但是和我理解的不一样,我说下我是怎么想的,大家帮我指正下,谢谢。
1.(?=(\d{3})+$)/g 这里用了一个零宽断言,我认为(\d{3})后边这个+是说出现1次或更多次的意思,那么如果我将前边的字符串换成'2'的时候我发现也匹配成功了,按理说他没有匹配到3个数字啊!为什么还是成功了呢??

2.这个$1匹配的应该是表达式(\d)这个啊,这个不是1个数字吗,为什么显示结果$1匹配的确是3位呢??

求大神解答··


高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(4)
学霸

第一问你说的换成2是指把{3}换成{2}吗? 这样最后结果只会是"1,23,34,56,56,32"

第二问我的理解是$1指的是匹配出来的项中符合第一个小括号的内容,匹配的项有"5632","4565632","2334565632",红色部分就是符合第一个小括号的,然后在这几个数的后面添加逗号。


いいねを押す +0
三叔

问题一:

(\d{3})+$ 的意思是连续匹配 3 个数字,且最后一次匹配以 3 个数字结尾。如果将数字变成 2,那么就是连续匹配 2 个数字且最后一次匹配也是 2 个数字,就像这样 "1,23,34,56,56,32"

问题二:

$1 并不是 1 ,因为 1 并不符合条件(?=(\d{3})+$),它要求一个数字(\d)后面的数字的个数是 3 的倍数,只要满足这种条件,(\d) 才能匹配成功,才能让 $1 反向引用。“12334565632” 这个例子中,只有第二,第五,第八个数字满足条件


いいねを押す +0
学霸

/(\d)(?=(\d{3})+$)/g , 这个正则表达式我是这么理解的:
先理解一个要点:/(\d)(?=(\d{3})+$)/g
红色的 \d 和 $ 之间,数字字符的个数是 3 的整数倍。

然后,把这个数字字符捕获到分组中,在它后边加个逗号“,”。  
效果如下:
'12334565632'  
替换后:
'12,334,565,632'

用零宽断言,是为了保证后面的字符不被消耗掉,这样可以多次匹配。


いいねを押す +0
三叔

网上这个方法用的是 零宽度正预测先行断言,它断言匹配的自身出现的位置d的后面能跟着匹配到1个或者n个3位数且刚好到结尾$。
1.那么如果我将前边的字符串换成'2'的时候我发现也匹配成功了,不管你换的是字符串还是正则表达式,应该都是不成功的。
2.$1匹配的就是表达式(d)这个。你可以把全局g去掉看一下:

'12334565632'.replace(/(\d)(?=(\d{3})+$)/, "$1,"); //"12,334565632"

题中分别匹配的是str[1],str[4],str[7] ,并在后面加上','


いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート