第一个和最后一个正则表达式匹配

First and last regex match

嗨,我的程序有问题,我已经编写了下面的代码,它 returns 达到了预期的结果。但是,我只对比赛的第一次和最后一次发生感兴趣。我该怎么做?

foreach (@array)
{
    $element = $_;
    foreach(@array2)
    {
        if($_ =~ s/($element)//ig)
        {
            print "$_ \n";
        }
    }
}

目前循环遍历数组中的每个元素,在第二个数组中找到它并打印整行。它 returns 预期的结果,但是我想要第一场比赛和最后一场比赛。

foreach my $elm2 (@array2) {
     my $state = 'start';
     my $first, $last;

     foreach my $elm1(@array1) {
           if (($state eq 'start') && ($elm1 =~ m/$elm2/i)) {
               $first =  "$elm1";
               $state = 'last';
           }
           elsif (($state eq 'last') && ($elm1 =~ m/$elm2/i)) {
               $last = $elm1;
           }
     }
     print "$elm2,$first,$last\n";
}

也许可以这样做

foreach (@array)
{
    $first = "";
    $last = "";
    $element = $_;
    foreach(@array2)
    {
        if($_ =~ s/($element)//ig)
        {
            if (!length($first)){
                $first = $_;
            }
            else {
                $last = $_;
            }
        }
    }
    if (length($first) && length($last)) {
        print "\n----------\nfirst = '$first'\nlast = '$last'";
    }
}

完全忘记了 grep。

foreach my $elm2 (@array2) {
      my @matches = grep(/$elm2/i, @array1);
      if (@matches && (scalar (@matches > 1))) {
         print "$elm2,$matches[0], $matches[-1]\n";
      }
      elsif (@matches) {
         print "$elm2,$matches[0]\n";
      }
      else {print "no matches\n";};
}

有点晚了,但我认为这是你可以使用的

找到第一个匹配项

if ($_ =~ m/($element)/) { print ; }

找到最后一场比赛

if ($_ =~ m/.*($element)/) { print ; }

假设您要检查 @array2 的哪些元素与 @array 中的任何模式匹配并打印其中的第一个和最后一个,最简单的方法是从内容构建交替正则表达式@array 并使用它过滤 @array2

像这样

my $re = join '|', @array; # Build a regex
$re = qr/$re/;             # Compile it

my @matches = grep /$re/, @array2;
print "$_\n" for @matches[0,-1];