在Perl正则表达式中打印模式匹配线

时间:2013-08-12 10:01:24

标签: regex perl

我正在使用像这样的正则表达式在多行输入中寻找关键字

if($input =~ /line/mi)
{
    # further processing
}

输入变量中的数据可能是这样的,

this is
multi line text
to be matched
using perl

代码正常运行并与关键字匹配。但是,我还想获得匹配模式的行 - “多行文本” - 并将其存储到变量中以供进一步处理。我该怎么做?

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

你可以将这些行插入一个数组,然后它也将作为你的条件:

my @match = grep /line/mi, split /\n/, $input;
if (@match) {
    # ... processing
}

答案 1 :(得分:0)

TLP的答案更好,但你可以做到:

if ($input =~ /([^\n]+line[^\n]+)/i) {
    $line = $1;
}

答案 2 :(得分:0)

我会查看匹配是否在multiline-String中,如果匹配,将其拆分为行,然后查找正确的索引号(从0开始!):

#!/usr/bin/perl

use strict;
use warnings;

my $data=<<END;
this is line
multi line text
to be matched
using perl
END

if ($data =~ /line/mi){
    my @lines = split(/\r?\n/,$data);
    for (0..$#lines){
        if ($lines[$_] =~ /line/){
            print "LineNr of Match: " . $_ . "\n";
        }
    }
}

答案 3 :(得分:0)

你尝试过他吗? 这适合我。 $ 1表示()内的正则表达式捕获 如果其中一行中只有一个匹配。如果多行匹配,则只捕获第一个匹配。

if($var=~/(.*line.*)/)
{
print $1
}

如果要捕获具有字符串行的所有行,请使用以下内容:

my @a;
push @a,$var=~m/(.*line.*)/g;
print "@a";
相关问题