2012-03-14 5 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

어떻게해야합니다. *합니다. *? 모든 인스턴스에 대해 이제 두 번째 그룹이 아닌 첫 번째 그룹이 생성됩니다. 나는 왜 내가 두 그룹을 얻을 수 없는지 아직도 알 수 없다. – Sumedh

+1

세 곳에서 모두 변경하셨습니까? '$ 2'와'$ 3'가 두 그룹에서 동일하게 보이기 때문에'. *'을 한 곳에 그대로 남겨두면 첫 번째 그룹 만 일치하는 것처럼 보이게됩니다. 사실, 정규 표현식이 두 그룹과 실제로 일치 할 때 함께. – 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

@ umedh - 환영합니다. –