Perl:正则表达式只打印找到的第一个模式

时间:2017-09-29 13:45:05

标签: regex perl

我正在尝试解析一个html文件,我有一个正则表达式,可捕获所有p标记内的模式。出于某种原因,它只打印出找到的第一个实例。

?:

当我使用下面的测试运行它时,它只打印出第一部分而不打印其他3.当我将if语句切换到while循环时,它不能正常工作。谁能告诉我这里我做错了什么?

my @newH2Array = ("Part I", "Part II", "Part III");
my $linenumber = 0;
while (my $line = <$parser>){
    chomp $line;
    $linenumber++;
    if($line =~ /^<p>/){
        if($line =~ /(Part [IVX]+)/gi) {
            if (grep{ lc $_ eq lc $1 } @newH2Array){
                print "found a hit <" . $1 . "> that matches array element on line" . $linenumber;
            }
        }
    }
}

结果应该是。

<p>Part I should be found. Part II should be found also. Part III should be found.</p>

2 个答案:

答案 0 :(得分:3)

if语句是二元选择。它要么匹配要么不匹配。对于循环,您需要一个循环结构 - 如while

我还使用say()代替print(),Perl的内置$.代替$linenumber,我在字符串中插入变量。

哦,并切换到<DATA>以便于测试。

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

my @newH2Array = ("Part I", "Part II", "Part III");
my $linenumber = 0;
while (my $line = <DATA>){
    chomp $line;
    if ($line =~ /^<p>/){
        while ($line =~ /(Part [IVX]+)/gi) {
            if (grep{ lc $_ eq lc $1 } @newH2Array){
                say "found a hit <$1> that matches array element on line $.";
            }
        }
    }
}

__DATA__
<p>Part I should be found. Part II should be found also. Part III should be found.</p>

答案 1 :(得分:2)

您正在使用/g匹配,但由于if,您只参加了第一场比赛。你需要迭代所有的比赛。一种方法是使用while循环。

my @newH2Array = ("Part I", "Part II", "Part III", "Part X");

while (my $line = <DATA>){
    chomp $line;

    if($line =~ /^<p>/){
        while ($line =~ /(Part [IVX]+)/gi) {
            if (grep{ lc $_ eq lc $1 } @newH2Array){
                print "found a hit <$1> that matches array element on line $.\n";
            }
        }
    }
}

__DATA__
<p>Part I should be found. Part II should be found also. Part III should be found.</p>
<p>Part X should be found. Particles are fun.</p>

请注意,我删除了$linenumber。您可以使用$.,它始终是最后一个文件句柄的当前行号。

这是输出。

found a hit <Part I> that matches array element on line 1
found a hit <Part II> that matches array element on line 1
found a hit <Part III> that matches array element on line 1
found a hit <Part X> that matches array element on line 2