【问题标题】:Print line of pattern match in Perl regex在 Perl 正则表达式中打印模式匹配行
【发布时间】:2013-08-12 18:39:08
【问题描述】:

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

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

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

this is
multi line text
to be matched
using perl

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

感谢您的帮助。

【问题讨论】:

  • my @match = grep /line/mi, split /\n/, $input 也许?尽管 /m 修饰符在该正则表达式中完全没用。

标签: regex perl


【解决方案1】:

您可以将这些行 grep 到一个数组中,然后该数组也将用作您的条件:

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

【讨论】:

  • 您应该删除此处无效的/m,因为没有^$ 的实例。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我会查看匹配项是否在多行字符串中,如果是,则将其分成几行,然后查找正确的索引号(从 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";
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      你试过他的吗? 这对我有用。 $1 代表在() 中捕获正则表达式 如果其中一行只有一个匹配项。如果多行匹配项,则只捕获第一个。

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

      如果要捕获所有包含字符串行的行,请使用以下代码:

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

      【讨论】:

      • 如果我将参数传递给我的 perl 脚本会怎样 - 在这种情况下会正常工作吗?
      • 你传递的论点是什么?
      • 没关系,我对 shell 脚本和 perl 的参数语法感到困惑。由于 $1 表示 shell 脚本的第一个参数,我将它与 perl 混合在一起,并认为它会导致打印参数值而不是正则表达式输出:-)
      猜你喜欢
      • 2015-02-24
      • 1970-01-01
      • 2017-01-20
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      相关资源
      最近更新 更多