寻找子串的边界

时间:2010-09-27 20:48:29

标签: regex perl

我有一个包含多个子字符串的字符串,每个子字符串包含一个或多个“E”字符。我试图使用Perl和regex获取每个这些基线的坐标。这是我最初尝试过的。

#!/usr/bin/perl
use strict;

my $str = "GGGFFEEIIEIIIIEEEIIIETTGGG";
foreach my $match($str =~ m/(E+)/)
{
  print "match: $match, coords: (". $-[0] .", ". $+[0] .")\n";
}

终端输出如下所示......

> ./test
match: EE, coords: (5, 7)

所以它成功找到了第一个子串。但我想确定每个子字符串。所以我将'g'修饰符添加到正则表达式中,就像这样......

#!/usr/bin/perl
use strict;

my $str = "GGGFFEEIIEIIIIEEEIIIETTGGG";
foreach my $match($str =~ m/(E+)/g)
{
  print "match: $match, coords: (". $-[0] .", ". $+[0] .")\n";
}

给出以下终端输出。

> ./test
match: EE, coords: (20, 21)
match: E, coords: (20, 21)
match: EEE, coords: (20, 21)
match: E, coords: (20, 21)

如您所见,它正确地找到每个子字符串,但我只是拉出最后一个匹配的坐标。也许我正在使用$ - 和$ +错误?我有什么想法可以正确地抓住这些坐标?感谢。

1 个答案:

答案 0 :(得分:5)

foreach首先构建匹配列表,然后迭代它们。此时,@-@+仅包含上次匹配的数据。尝试:

#!/usr/bin/perl
use strict;

my $str = "GGGFFEEIIEIIIIEEEIIIETTGGG";
while ($str =~ m/(E+)/g)
{
  printf "match: %s, coords: (%d, %d)\n", $1, $-[0], $+[0];
}