JavaScript中正则表达式匹配问题

新手上路,请多包涵

代码如下
`
let num = "12345678";

num.match(/(d{3})+$/g)//返回值为[ '345678' ]

num.match(/(d)(?=(d{3})+$)/g)//返回值为[ '2', '5' ]
`

为什么正则表达式/(\d{3})+$/g 匹配的字符串是 以最大的 3 的倍数(在本例中为6)个数字结尾的子串?
而正则表达式/(\d)(?=(\d{3})+$)/g 匹配的字符串是 以 3 的倍数(从大到小,在本例中为6、3)个数字结尾的子串 的前一个数字?
哪位大佬可以帮我解答一下?
再帮我解析一下num.replace(/(\d)(?=(?:\d{3})+$)/g,'$1,')的匹配及替换过程吧。这里是先匹配再替换?还是匹配到一个结果了就马上替换呢?$1是第一个匹配到的对象吧,它是怎么进行那么多处的替换的?

阅读 1.6k
2 个回答

正则匹配从头部开始, 不管是不是回溯匹配

  1. /(\d{3})+$/ 整体看起来意思就是 3个数字一组共多组连接直到结尾, 也就是长度为3,6,9,12,15等的连续数字结尾的串。从头算起来那肯定是最长的。
  2. /(\d{1,3})(?=(\d{3})+$)/ /(?=)/ 预测模式的匹配, 我就试一下,看看后面是不是3的倍数个数字,是的话,我就匹配前面的 \d{1,3}, replace这一次过后(“12345678”举例, replace 过后剩下的就是“345678”了), 剩下的继续这么玩,就会拿到345,因为678长度是3的倍数。

通俗来讲,这个正则的意思为:如果一个数字`后面至结尾的数字为3的倍数,就添加一个逗号分隔符`

12345678为例,(?=)预言没有宽度,所有在一个一个匹配单个数字后面的条件
  • 1 2345678 不满足
  • 12 345678 满足 => 结果为 12,345678
  • 12,3 45678 不满足
  • 12,34 5678 不满足
  • 12,345 678 满足 => 结果为 12,345,678
  • 12,345,6 78 不满足
  • 12,345,67 8 不满足
  • 12,345,678 不满足
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题