【Perl】字符串匹配:如何正确匹配出’aaaa'中的3个‘aa'模式?

一段Perl的代码,输出结果为2。然而显然在字符串'aaaa'中含有3个'aa'模式。请问如何做到3次匹配?

#!/usr/bin/perl
$a = 'aaaa';
$i ++ while $a =~ /aa/g;
print $i;
阅读 7.8k
2 个回答
perl#!/usr/bin/perl
$a = 'aaaa';
$i ++ while $a =~ /a(?=a)/g;
print $i;

正则本质是状态机一个个consume字符扭转状态,捕获成功第一个aa以后相当于前两个字符都被consume掉从第三个a开始匹配了,所以原来的结果是2,这里用零宽断言让正则去look ahead匹配模式里第二个a而不将其consume掉,从而得到3

编译原理学得不好,解释得有点乱……


图形的力量,感觉比字清楚多了

图片描述

新手上路,请多包涵

在perl实例精解中正向前查找里面有这样的解释,你使用的这种方法是一次性匹配两个a,造成aa,aa,分开匹配,向前查找是一次性匹配一个