2012-03-14 10 views
2

私はテキストの束を持っていて、パターンのグループと一致させようとしています。私が使用している正規表現はパターンと一致することができます。最初のグループ。複数の複数行のグループに一致する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.............................   

答えて

5

問題は最初の.*が一致を防ぐことなくできるだけ貪欲に一致していることです。だから、それは第二のWorld Wide Port Numberまですべてを飲み込む。パターンの他の部分を既に使用しているように、.*?に変更する必要があります。 (そして、同様に.*の他のインスタンスのために。)

+0

どうあるべきかです。*へ。*?すべてのインスタンスのために、今、私は最初のグループを2番目のグループではありません。なぜ私は両方のグループを得ることができないのか分かりません。 – Sumedh

+1

3箇所すべてを変更してもよろしいですか?あなたの '$ 2'と' $ 3'は両方のグループで同じように見えるので、 '。*'をそのまま1つの場所に残すと、最初のグループだけが一致しているように見えます。実際には、正規表現は本当に両方のグループ一緒に。 – ruakh

+0

ruakh、あなたは人間の中の神です。ありがとうございました、私はいくつかのばかげたミスをしていたが、何が分からないのか分かっていました。 – Sumedh

0

ここで、それは私が変更

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

Devendraに感謝します。これもうまくいきました。私のコードにruakhのコメントを追加しました。 – Sumedh

+0

@sumedh - ようこそ –

関連する問題