以下内容对我来说似乎相同,但它们给出的结果不同:

$ perl -e '
my $pop = 298444215;
$pop =~ s/(?<=\d)(?=(\d\d\d)+$)/,/g;
print $pop,"\n"'
298,444,215

$ perl -e '
my $pop = 298444215;
$pop =~ s/(?<=\d)(?=(\d\d\d)+)/,/g;
print $pop,"\n"'
2,9,8,4,4,4,215

结果,我期望的是第一个(在数字的正确位置放置一个逗号)。
但是,为什么仅仅通过添加/删除$来得到如此不同的结果呢?

最佳答案

$确保在存在匹配项的位置之前,三位数的数字向上。

这样,匹配项将仅位于这些位置(为清楚起见插入空格):

        3     3
      v---v v---v
2 9 8 4 4 4 2 1 5
     ^     ^

其他位置不匹配,因为到最后为止,每3个一组中没有数字。

例如。在这里不匹配:
    3     3    2
  v---v v---v
2 9 8 4 4 4 2 1 5
 ^

因为有2组3,所以它不能与行尾或另一组3位数字匹配。

但是如果没有$,则lookahead在更多位置匹配:
2 9 8 4 4 4 2 1 5
 ^

在此,后向查找得到了满足,前向查找也得到了满足,因为前面至少有一组3位数字,它们是:
2 9 8 4 4 4 2 1 5
  ^---^

前瞻在这里很满意,不需要匹配更多的内容。

当然,这意味着后面的所有其他位置也将匹配,直到匹配几乎结束为止:
2 9 8 4 4 4 2 1 5
             ^

在此,由于前面只有2位数字,因此无法匹配。

09-12 08:11