2017-03-08 58 views
0

的這裏是我的正則表達式鏈接:https://www.regex101.com/r/jksOY7/1Perl的正則表達式匹配對字符串

我正在比賽我的正則表達式。但問題是輸出。我得到六場比賽。如果我使用while循環,那麼我會繼續輸出。

但我需要使用Perl來關聯如下。

[{ 
    match1=> 'GEL-111111111-22222', 
    match2=> 'UP Ej011.2223' 
}, 
{ 
    match1=> 'FPL-222222222-33333', 
    match2=> 'UP Ek04112.2883' 
}, 
{ 
    match1=> 'HGL-333333333-44444', 
    match2=> 'UP Eg04213.2323' 
}] 

下面的Perl代碼只是返回繼續輸出。

while($tunnel =~ /(?![\-]+)([A-Z]{3,5}-[0-9\-\_]+)|(UP\s+([A-Za-z0-9\/]+.[0-9]+))/g){ 
    print "\n"; 
    print Dumper $1; 
    print "\n"; 
    print "\n"; 
    print Dumper $3; 
    print "\n"; 
} 

有人可以請幫助,以獲得如上輸出?

+0

爲了讓兩個捕獲組比賽時,你需要描述兩個羣體之間的內容,而不是使用交替'|'。另外第三個捕獲組(或第二個捕獲組,取決於你想要的)和lookahead是無用的,刪除它們。其他的事情,你需要逃避的點。 –

+1

不是一個真正的解決方案,而是一種優化:https://www.regex101.com/r/jksOY7/2 - 同時還有一個分支重置:https://www.regex101.com/r/jksOY7/3 – Jan

+0

你可以顯示你想要的輸出嗎? – zdim

回答

0

我的Perl有點生鏽。

展開後的正則表達式

(?s) 
([A-Z]{3,5} - [0-9_-]+)  # (1) 
(?: 
     (?! --------------) 
     . 
)*? 
(       # (2 start) 
     UP \s+ 
     [A-Za-z0-9/]+ \. [0-9]+ 
)        # (2 end) 

代碼

use strict; 
use warnings; 
use Data::Dumper; 


$/ = undef; 

my $teststring = <DATA>; 

my @ary; 

while ($teststring =~ /(?s)([A-Z]{3,5}-[0-9_-]+)(?:(?!--------------).)*?(UP\s+[A-Za-z0-9\/]+\.[0-9]+)/g) 
{ 
    my $href = {}; 
    $href->{'group1'} = $1; 
    $href->{'group2'} = $2; 
    push @ary, $href; 
} 

print Dumper \@ary; 

__DATA__ 

Group  Name  FT Description   FT  Description   DT 
------------------------ ----------------------------- ----------------------------- 
GEL-111111111-22222 
      IWRJWERODSF_WERONSDFELEO_23232 
         UP Ej011.2223    DWD  56.67.22.234 1222332432 
                        DWW 
---------------------------------------------------------------------------------------- 
FPL-222222222-33333 
      WERWERDSFSD_PJRRINSDFKEW_10022 
         UP Ek04112.2883   DWD  78.24.85.344 1232332432 
                        DW 
---------------------------------------------------------------------------------------- 
HGL-333333333-44444 
      SDFOWERNOWE_SDFONWERIODS_232323 
         UP Eg04213.2323   DWD  Eg04213.2323    DWD 
---------------------------------------------------------------------------------------- 

輸出

$VAR1 = [ 
      { 
      'group1' => 'GEL-111111111-22222', 
      'group2' => 'UP Ej011.2223' 
      }, 
      { 
      'group1' => 'FPL-222222222-33333', 
      'group2' => 'UP Ek04112.2883' 
      }, 
      { 
      'group1' => 'HGL-333333333-44444', 
      'group2' => 'UP Eg04213.2323' 
      } 
     ]; 
+0

這真的太棒了。非常感謝。 – Raja