正则:将一串数字的每3个就用逗号分开的问题

浏览:50日期:2023-06-09

问题描述

'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位呢??

求大神解答··

问题解答

回答1:

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

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

回答2:

问题一:

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

问题二:

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

回答3:

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

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

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

回答4:

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

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

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

相关文章: