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

时间:2015-01-06 03:59:30

标签: regex

以下是文字:

  

1234567890

正则表达式:

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

预期结果:

  

1234567890

实际结果:

  

1,234567890

这是一个用于从mastering regular expression开始从右到左添加逗号的示例。这是解释:

  

这是因为(\ d \ d \ d)+匹配的数字现在实际上是最终匹配的一部分,因此不会保持“不匹配”,并且可以通过/ g用于下一次正则表达式的迭代。

但我仍然不理解它,我希望任何人都可以帮助我详细解决它。提前谢谢。

1 个答案:

答案 0 :(得分:1)

<强>前提条件

正则表达式引擎将从左到右匹配每个字符。并且匹配的字符由引擎消耗。一旦消耗掉,你就不能再回头重新创造这些角色了。

(\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.

现在魔法发生了。查看引擎消耗了所有字符,并且指针已成功匹配到达输入的末尾。取代\1,\2发生。现在没有办法将指针回溯到

 1234567890
    |
   (\d)

为了获得预期的结果

<强>解决方案

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

展望未来将在这里发挥作用。

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

此处第二组(?=(\d\d\d)+\b)是向前看并且不消耗任何字符,但会检查字符是否匹配

Regex Demo

使用环顾四周

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

下面

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

  • (?=(\d\d\d)+\b)展望未来。检查后跟3位数字。

Regex Demo