my $s1 = 'a1a2a3a4a5';
my $pat = '(a\d(?=a\d)a\d)';
while($s1 =~ m/$pat/g)
{
print "$1\n"
}
我想获取输出:
a1a2a3
a2a3a4
a3a4a5
但是输出是:
a1a2
a3a4
据我所知,循环中的下一个匹配项是从?=开始的,但是根据我的实践,这种方式是行不通的。谁能指出这个问题。
谢谢
答案 0 :(得分:4)
....循环中的下一个匹配项从?=
开始
//g
中的下一场比赛从最后一场比赛开始的地方开始。 (?=...)
并没有神奇地设置下一场比赛的开始位置;它只是检查(?=...)
内的零件是否在当前位置匹配而无需提前位置。
如果您的正则表达式为/(a\d(?=a\d))/
,则匹配将在第一个a\d
之后进行,尽管它可以确保后面还有第二个a\d
。但是您的正则表达式为/(a\d(?=a\d)a\d)/
,这意味着简化了匹配项/a\da\d/
,也就是说,它是在第二个a\d
之后进行的。
例如,您可以为达到自己的目标而做的事情如下:
my $s1 = 'a1a2a3a4a5';
while($s1 =~ m/(a\d(?=(a\da\d)))/g)
{
print "$1$2\n"
}
这会将第一个a\d
放入$1
,将第二个a\da\d
捕获到$2
中,但在第一个a\d
之后仍然结束比赛。只有您需要先打印"$1$2"
,而不是"$1"
。