Perl - 正则表达式匹配的字符串

时间:2013-02-22 20:27:05

标签: perl regex

if (my @matches = $input_string =~ /$metadata[$_]{"pattern"}/g) {
  print $-[1] . "\n"; # this gives me error uninitialized ...
}

print scalar @matches;给了我4,没关系,但如果我使用$-[1]来开始第一场比赛,那就会给我带来错误。哪里有问题?

EDIT1:我如何在字符串中获得每场比赛的位置? 如果我有字符串“ahoj ahoj ahoj”和regexp / ahoj / g,我怎么能在字符串中获得每个“ahoj”的开头和结尾的位置?

1 个答案:

答案 0 :(得分:8)

数组@-包含上一次成功匹配开始的偏移(在$-[0]中),并且该匹配中可能存在的任何捕获的偏移量(在$-[1]中, $-[2]等。)。

您的字符串中没有捕获,因此只有$-[0]有效,并且(在您的情况下)最后一次成功匹配是第四次,因此它将包含模式的第四个实例的偏移量。

获得个别比赛抵消的方法是写

my @matches;
while ("ahoj ahoj ahoj" =~ /(ahoj)/g) {
  push @matches, $1;
  print $-[0], "\n";
}

<强>输出

0
5
10

或者,如果您不想要单个匹配的字符串,那么

my @matches;
push @matches, $-[0] while "ahoj ahoj ahoj" =~ /ahoj/g;