这段每4个数字加一个逗号的正则该怎么理解?

    var num='123456789'
    var str=num.replace(/(?=(\d{4})+$)/g,',')
    console.log('======str',str);// 1,2345,6789

上述代码可以给每4个数字加一个逗号,但是这正则该怎么理解呢?
因为我的理解结果是1234,5678,9
但实际正则在替换时,似乎是从右向左每4个判断一次,让我很疑惑

阅读 1k
avatarAI BotBETA

这段代码中的正则表达式 /(?=(\d{4})+$)/g 的工作原理如下:

  • (?=...) 是一个正向前瞻断言,它表示后面的模式必须匹配,但不会消耗字符。在这个例子中,它用来检查下一个位置是否有4个数字(\d{4})。
  • \d{4} 是一个模式,匹配任何4个数字的序列。
  • + 是一个量词,表示前面的模式(在这个例子中是 \d{4})可以重复一次或多次。
  • $ 是指输入的结束,所以 \d{4}+ 匹配直到输入的末尾的4个数字的序列。
  • g 是全局标志,表示整个输入都应该被尝试匹配这个模式的地方。

在执行 replace 方法时,正则表达式 /(?=(\d{4})+$)/g 会从输入字符串的末尾开始,尝试匹配以4个数字结尾的模式。一旦找到这样的模式,它就会插入一个逗号。由于 g 标志,它会继续尝试在整个字符串中找到其他以4个数字结尾的模式。

因此,如果你有一个字符串 '123456789',正则表达式将找到 '1234'、'5678' 和 '9' 这三个以4个数字结尾的模式,并且都会插入一个逗号,结果是 '1,2345,6789'。

这并不是从右向左每4个数字判断一次,而是从字符串的末尾开始,寻找以4个数字结尾的模式。当你看到结果 '1,2345,6789' 的时候,似乎是先找到 '9',然后向左边找,找到 '5678',再向左找到 '1234',然后插入逗号。但实际上,是因为它首先匹配了整个字符串(即从右到左),然后插入逗号并继续匹配,直到字符串的开头。

3 个回答

是从前往后查的,可以把正则的全局模式去掉实验下:

const num='123456789'
const str=num.replace(/(?=(\d{4})+$)/,',')
console.log(str) // 1,23456789

/(?=(\d{4})+$)/g 匹配的位置是第1位(数字2的位置,后面有8个连续数字)和第5位(数字6的位置后面4个连续数字)。所以会在数字2和数字6的位置用逗号替换后面的数字,同时因为有前瞻断言不会消耗字符,相当于在2和6的位置插入了逗号。

image.png

?=匹配的是符合条件的内容前面的内容,(\d{4})+$表示从结束位置往前第4、8、12、...位数,连起来就是匹配结束位置前面第4、8、12、...位,然后在他们前面加上逗号

因为正则执行到第一次的“2345”前面时候,它会检查后面是不是有连续的四个数字并且这些数字是在字符串的结尾。第一次匹配到“6789”时候,满足这个条件,所以在“2345”和“6789”之间插入了一个逗号。后面再执行然后向左移动四个字符时候,它会再找到了满足条件的位置,在“1”和“2345”之前插入了一个逗号。

推荐问题
宣传栏