如何在单行字符串中找到所有perl正则表达式匹配?

时间:2016-06-30 18:13:53

标签: regex perl

我需要解析一堆遵循类似格式的单行文本:

  

这是我需要解析[link [filename2 | path_to_file2]]的示例实例[link [filename1 | path_to_file1]]。这是另一个[link [filename3 | path_to_file3]]等等[link [filename4 | path_to_file4]]

我希望在|符号之前和之后的每个文本都使用正则表达式。

我有以下正则表达式:

while ( my @row = $sth->fetchrow_array() ) {
    my $line = $row[4];
    if($line =~ /\[link\[(.*?)\|(.*?)\]?\]/g){
            print "MATCH1: $1\n";
            print "MATCH2: $2\n";
        }
}

不幸的是,它只会返回第一个实例(filename1path_to_file1)。如何更改它以便捕获所有实例?

我想要以下输出:

MATCH1:filename1
MATCH2:path_to_file1
MATCH1:filename2
MATCH2:path_to_file2
MATCH1:filename3
MATCH2:path_to_file3
MATCH1:filename4
MATCH2:path_to_file4

1 个答案:

答案 0 :(得分:0)

在列表上下文中使用regexp匹配:

while ( my @row = $sth->fetchrow_array() ) {
    my $line = $row[4];
    my @captures = $line =~ /\[link\[(.*?)\|(.*?)\]?\]/g;
    while(@captures){
        my $filename = shift @captures;
        my $path = shift @captures;
        print "MATCH1: $filename\n";
        print "MATCH2: $captures\n";
    }
}