Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 行尾如何影响这里的正则表达式?_Regex_Perl - Fatal编程技术网

Regex 行尾如何影响这里的正则表达式?

Regex 行尾如何影响这里的正则表达式?,regex,perl,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

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

$ 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  
$perl-e'
my$pop=298444215;

$pop=~s/(?The
$
确保匹配位置前面有三位数

因此,匹配将仅位于这些位置(插入空格以便澄清):

其他位置不匹配,因为在3的集合中直到结尾都没有数字

例如,此处不匹配:

    3     3    2
  v---v v---v
2 9 8 4 4 4 2 1 5
 ^
因为有两组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和98444215之间的点上,第二个示例中的984 442与后面的984 442相匹配,但由于第一个示例中,三个数字块必须紧跟在行尾,因此不匹配。

您需要从字符串末尾开始计算三个数字组以插入t他正确地使用逗号

第一种模式表示查找任意数量的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

好像你暗示
5
5$
在这里是不同的。我不太清楚为什么会这样is@Jim这取决于情况,但是
5
5$
是不同的。
/5/g
将匹配
5555
中的所有
5
,但是
/5$/g
将只匹配
5
中的最后一个
e> 5555
@Jim这些调试器可能会有帮助:;。您可以单击
+
句柄来查看匹配是如何工作的。问题归结为“为什么在一种情况下在“2”之后添加逗号,而在另一种情况下不添加逗号?”知道了这一点,很容易看出其中的区别。只要试着从这个位置开始看模式是如何匹配的。
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