向数字添加逗号时需要查看解释

时间:2014-02-23 22:00:06

标签: regex

我很乐意在理解下面代码中发生的事情时给予一些帮助。它只是没有点击。所以,代码片段(取自此book

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

将数字123456789转换为123,456,789。 (g是全局标志)。现在,假设我们有1234号码。根据我的理解(?<=\d)将我们放在1前面,如此1 | 234。然后,(?=(\d\d\d)+$)选择后面的外观,并评估剩余的数字。由于234匹配模式(3位数和1位终止线),我们的替换发生(1,234)。我希望我做对了。

现在,当我把我的数字变得更大时,我很困惑说1234567.当我把它放到一个正则表达式测试器中时,我得到1 | 234 | 567但是在我看来我期望1234 | 567。所以为什么 ?当4未被终止线终止时,为什么234的前瞻评估为真?这与全球旗帜有什么关系吗?谢谢。

1 个答案:

答案 0 :(得分:3)

前瞻查找三位数的倍数(\d\d\d)+匹配3个,6个,9个......数字,因此它在234567之前匹配。

是的,全局标志与正则表达式匹配两次有关(尽管没有它,因为你可以很容易地测试,结果将是1|234567)。

让我们看看当我们浏览字符串"1234567"时会发生什么:

1.  1234567
   ^ (?<=\d) doesn't match - regex fails.
2. 1 234567
    ^ (?<=\d) matches "1", (?=(\d\d\d)+$) matches "234567"! MATCH!
3. 12 34567
     ^ (?<=\d) matches "2", (?=(\d\d\d)+$) doesn't match.
4. 123 4567
      ^ (?<=\d) matches "3", (?=(\d\d\d)+$) doesn't match.
5. 1234 567
       ^ (?<=\d) matches "4", (?=(\d\d\d)+$) matches "567"! MATCH!
6. 12345 67
        ^ (?<=\d) matches "5", (?=(\d\d\d)+$) doesn't match.
7. 123456 7
         ^ (?<=\d) matches "6", (?=(\d\d\d)+$) doesn't match.
8. 1234567
          ^ (?<=\d) matches "7", (?=(\d\d\d)+$) doesn't match.