Perl正则表达式匹配多个多线组

时间:2012-03-14 20:17:28

标签: regex perl

我有一堆文本,我正在尝试匹配一组模式,我正在使用的正则表达式能够匹配模式,但问题是它只匹配第二组而不是第一组。

open(FILE, "match.txt") || die("Could not open file ");
my $text = do { local $/; <FILE> };

while( $text =~ m/FibreChannel SCSI Interface.*World Wide Port Number\.*(.*?)\n.*Driver\.+(.*?)\n.*Vendor Name\.+(.*?)\n/sgmp )
{
    print "$1\n$2\n$3\n";
}

打印

0x1b201
lpfc_740
测试公司

以上代码有效,但它只显示第二组中的文本而不是第一组。我在这里错过了什么?有更好的方法吗?

我以为会打印

0x1a101
lpfc_740
测试公司
0x1b201
lpfc_740
测试公司

------------------------ match.txt包含

\==+FibreChannel SCSI Interface : 
        |----Link State.........................................Down
        |----World Wide Port Number.............................0x1a101
        \==+SCSI Interface : 
           |----Driver..........................................lpfc_740
           |----Queue Depth.....................................2038 
           \==+PCI Device : 
              |----Bus..........................................0x06 
              |----Vendor Name..................................Test Corporation
              |----Slot Description.............................

\==+FibreChannel SCSI Interface : 
        |----Link State.........................................Down
        |----World Wide Port Number.............................0x1b201
        \==+SCSI Interface : 
           |----Driver..........................................lpfc_740
           |----Queue Depth.....................................2038 
           \==+PCI Device : 
              |----Bus..........................................0x0a 
              |----Vendor Name..................................Test Corporation
              |----Slot Description.............................          

2 个答案:

答案 0 :(得分:5)

问题是第一个.*在没有阻止匹配的情况下尽可能地贪婪地匹配;所以,直到第二个World Wide Port Number吞下一切。您需要将其更改为.*?,就像您已经在模式中的其他位置使用一样。 (同样,对于.*的其他实例。)

答案 1 :(得分:0)

这是应该如何

$text =~ m/FibreChannel SCSI Interface.*?World Wide Port Number\.*([a-z0-9]+).*?Driver\.+(\w+).*?Vendor Name\.+([a-zA-Z ]+).*?\n/sgmp