首页 >社区问答列表 >正则:将一串数字的每3个就用逗号分开的问题

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

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

求大神解答··


  • 欧阳克
  • 欧阳克    2016-11-10 11:43:384楼

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

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


    +0添加回复

  • 回复
  • 三叔
  • 三叔    2016-11-10 11:43:283楼

    问题一:

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

    问题二:

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


    +0添加回复

  • 回复
  • 欧阳克
  • 欧阳克    2016-11-10 11:43:162楼

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

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

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


    +0添加回复

  • 回复
  • 三叔
  • 三叔    2016-11-10 11:43:031楼

    网上这个方法用的是 零宽度正预测先行断言,它断言匹配的自身出现的位置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添加回复

  • 回复