正则表达式:逗号分隔大整数(例如 2903 -> 2,903)

Regex: Comma Delimiting large integers (e.g. 2903 -> 2,903)

正文如下:

1234567890

正则表达式:

s/(\d)((\d\d\d)+\b)/,/g

预期结果:

1,234,567,890

实际结果:

1,234567890

这是一个示例,用于从 mastering regular expression 从右到左每 3 位数字添加一个逗号。解释如下:

This is because the digits matched by (\d\d\d)+ are now actually part of the final match, and so are not left "unmatched" and available to the next iteration of the regex via the /g.

但是我还是不太明白,希望大家能帮我详细解答一下。提前致谢。

先决条件

正则表达式引擎将从左到右匹配每个字符。匹配的字符被引擎消耗。一旦被消耗,你就不能返回再次消耗这些字符。

如何匹配 (\d)((\d\d\d)+\b)

  1234567890
  |
(\d)

  1234567890
   |||
  (\d\d\d)+

  1234567890
      |
     \b #cannot be matched, hence it goes for another `(\d\d\d)+`

  1234567890
      |||
    (\d\d\d)+

  1234567890
         |
        \b #cannot be matched, hence it goes for another `(\d\d\d)+`

  1234567890
         |||
      (\d\d\d)+

  1234567890
            |
           \b #matched here for the first time.

现在奇迹发生了。看到引擎消耗了所有字符并且指针已到达输入的末尾并成功匹配。替换 , 发生。现在无法将指针重新跟踪回

 1234567890
    |
   (\d)

为了得到预期的结果

解决方案

您没有提到您使用的是哪种语言。假设语言支持PCRE。

前瞻在这里会有很大用处。

s/(\d)(?=(\d\d\d)+\b)/,/g

这里第二组(?=(\d\d\d)+\b)是向前看,不消耗任何字符,但检查字符是否可以匹配

Regex Demo

环顾四周

s/(?<=\d)(?=(\d\d\d)+\b)/,/g

这里

  • (?<=\d)往后看。检查前面是否有数字

  • (?=(\d\d\d)+\b)向前看。检查是否后跟 3 位数字。

Regex Demo

  • Note on look arounds