以下内容对我来说似乎相同,但它们给出的结果不同:
$ 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位数字,因此无法匹配。