我有一堆文本,我正在尝试匹配一组模式,我正在使用的正则表达式能够匹配模式,但问题是它只匹配第二组而不是第一组。
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.............................
答案 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