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

时间:2015-01-14 22:05:20

标签: arrays regex perl

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

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

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

5 个答案:

答案 0 :(得分:1)

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";
}

答案 1 :(得分:0)

可能会这样做

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'";
    }
}

答案 2 :(得分:0)

完全忘记了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";};
}

答案 3 :(得分:0)

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

查找第一场比赛

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

查找最后一场比赛

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

答案 4 :(得分:0)

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

喜欢这个

@array2