线端如何影响正则表达式?

时间:2014-02-01 20:01:06

标签: regex perl

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

$ 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 个答案:

答案 0 :(得分:6)

$确保在匹配的位置前面有三位数字。

这样匹配只会在那些位置(插入空格以便澄清):

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

其他位置不匹配,因为在3组中没有数字直到结束。

E.g。这里不匹配:

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

因为有2组3然后它不能匹配行尾或另一组3位数。

但是如果没有$,前瞻会在更多位置匹配:

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位数。

答案 1 :(得分:3)

你的第一个例子匹配任何具有三位数倍数的东西作为输入行中的最后一个东西,而你的第二个例子匹配任何具有三位数倍的东西,但不一定一直到最后。

为了澄清,在字符串中2和98444215之间的点,在第二个例子中有一个匹配984 442,但是从你的第一个例子开始,三个数字的块必须紧跟在后面线,没有比赛。

答案 2 :(得分:3)

您需要从字符串末尾开始计算三个一组,以便正确插入逗号。

第一个模式说找到任意数量的3个组,其前面有一个数字,并在字符串的末尾结束,然后在那里插入一个逗号。这样做直到因为g标志它不能再这样做了。它实际上从字符串的开头开始执行插入。所以插入的顺序是

298,444215
298,444,215

第二种模式说要找到任意数量的3组,其前面有一个数字,但3组不必在字符串的末尾结束。所以它按以下顺序插入逗号:

2,98444215
2,9,8444215
2,9,8,444215
2,9,8,4,44215
2,9,8,4,4,4215
2,9,8,4,4,4,215