代码如下
`
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是第一个匹配到的对象吧,它是怎么进行那么多处的替换的?
正则匹配从头部开始, 不管是不是回溯匹配
/(\d{3})+$/
整体看起来意思就是 3个数字一组共多组连接直到结尾, 也就是长度为3,6,9,12,15等的连续数字结尾的串。从头算起来那肯定是最长的。/(\d{1,3})(?=(\d{3})+$)/
/(?=)/
预测模式的匹配, 我就试一下,看看后面是不是3的倍数个数字,是的话,我就匹配前面的\d{1,3}
, replace这一次过后(“12345678”举例, replace 过后剩下的就是“345678”了), 剩下的继续这么玩,就会拿到345,因为678长度是3的倍数。