如何通过RegularExpression实现此功能

时间:2019-01-02 03:42:18

标签: perl

my $s1 = 'a1a2a3a4a5';
my $pat = '(a\d(?=a\d)a\d)';
while($s1 =~ m/$pat/g)
{
   print "$1\n"
}

我想获取输出:

a1a2a3
a2a3a4
a3a4a5

但是输出是:

a1a2
a3a4

据我所知,循环中的下一个匹配项是从?=开始的,但是根据我的实践,这种方式是行不通的。谁能指出这个问题。

谢谢

1 个答案:

答案 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"

相关问题