当前位置: 首页 > 知识库问答 >
问题:

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

公孙芷阳
2023-10-09
    var num='123456789'    var str=num.replace(/(?=(\d{4})+$)/g,',')    console.log('======str',str);// 1,2345,6789

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

共有4个答案

拓拔谭三
2023-10-09

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

晏华奥
2023-10-09

image.png

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

小牛23000
2023-10-09

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

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的位置插入了逗号。

淳于博
2023-10-09

这段代码中的正则表达式 /(?=(\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',然后插入逗号。但实际上,是因为它首先匹配了整个字符串(即从右到左),然后插入逗号并继续匹配,直到字符串的开头。

 类似资料:
  • 正则获取指定字符到下一个大写字符之间的内容

  • 问题内容: 此代码打开url并在末尾附加,然后打开页面并将字符串打印到: 但是我得到这个结果: 如果我将字符串更改为(“ JD”,“哥伦比亚法学院” ....),那么我得到 我在文档中找不到如何指定分度符。 如果尝试使用,则会出现此错误: 谢谢您的帮助。 问题答案: 它需要一个字符串序列(例如:列表或元组)。您给它一个字符串。一个字符串也恰好是一个字符串序列,但是它是一个由1个字符串组成的序列,这

  • 我有四个超文本标记语言字段,我抓取它们的值并将它们添加到一个等式中,看起来像这样: 现在,一些值可能等于,结果是。那我该怎么办?

  • Leetcode加油站问题,这个答案该怎么理解? 题目地址 我在官方题解的下方评论中发现了一个答案,但是对于为什么这个答案可行我并不理解。 为什么sum >= 0说明有解,否则就无解呢? 这个答案我有一些思路。 sum >= 0 将相邻的remainGas[i],且它们的前缀和(这里的前缀和指的是这几个remainGas构成序列的前缀和)都大于等于0,合并成一个节点(此时这个节点代表了一段路径)。

  • 问题内容: 我有一个看起来像这样的字符串: 我要返回的是在每个第三个逗号后被拆分的,因此结果如下所示: 我发现了类似的功能,但它们不会以逗号分隔n个。 问题答案: 您可以尝试将方法与正则表达式一起使用 演示版 输出: 说明 表示一个数字,与[0-9]相同,例如或 表示一个或多个数字,例如或 表示一个或多个后跟逗号的数字,例如或 会接受三个数字,并且它们之间用逗号隔开 表示最后一个匹配项,或者如果没