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