第一个和最后一个正则表达式匹配
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];
嗨,我的程序有问题,我已经编写了下面的代码,它 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];