2016-04-04 10 views
1

この文字列と/ TNとforward /の間の数字を解析しようとしています。また、/ REFがある場合は、REF#も取得する必要があります。だからどちらかの状況になる可能性があります。オプション付きPerl正規表現

例文字列:

my $acis_string = 'EL41X/TN 333-3333 /DES TAT 313 223-2388 OE508-1-12-13/ORD R1244850301 /CD 02-03-15 /ZKMA 8001 T1ZF PNTCMINEDC0 PNTCMISOH00/SCS DQKUX /TN 333-3330, 6540/RTI 581 /LSO 248 340/REF 28/TGP 581 /ORD C1244888657/CD 02-12-16'; 

彼は私の基本正規表現だった:

push @matches, [$2, $1] while $acis_string =~ /\/TN (.*?)\/.*?(\/REF (\w+)\/)?/g; 

所望の出力:

$VAR1 = [ 
     [ 
     n/a, 
     '333-3333 ' 
     ], 
     [ 
     28, 
     '333-3330, 6540' 
     ] 
    ]; 

注: 多く/ TN /と/ REFがあるかもしれません文字列に

おかげで、 ケビン

+0

Staへようこそckオーバーフロー。あなたがここで何を求めているのか分かりません。あなたの質問には疑問はありません。あなたが知りたいことや働いていないことを明確にするために、[編集]してください。 – simbabque

答えて

0

あなたは、次の正規表現を使用することができます。

  • \/TN\s+([^\/]+):マッチ文字他のtha

    \/TN\s+([^\/]+)(?:(?!\/TN|\/REF).)*(?:\/REF\s+([^\/]+))? 
    

    RegEX DEMO

    説明を参照してください。 nは//TN後およびキャプチャグループ1

  • (?:(?!\/TN|\/REF).)*に置く:それらには/TNまたは/REF
  • (?:\/REF\s+([^\/]+))?がないことを確認すること文字に一致するようにロジック:必要に応じて2
  • /REF/以外の文字にマッチし、キャプチャグループに入れます
+0

このコードはうまくいった!入力いただきありがとうございます。 – kevin

+0

お手伝いします:) –

0

これを試してみてください:\/(TN[^\/]+)|\/(REF[^\/]+)

説明

  • \/は、あなたがのFileHandlerとレコードセパレータとして/TNを使用して文字列を読み取ることができ
1

/

  • |でないものまたはあなたの他のオプションが続く/
  • (TN[^\/]+)キャプチャTNをエスケープ:

    my @res; 
    { 
        my $ref; 
        local $/='/TN '; 
        open my $fh, '<', \$acis_string; 
        <$fh>; 
        while(<$fh>) { 
         $ref = m#/REF ([^/]*[^/\s])# ? $1 : 'n/a'; 
         push @res, [$ref, m#^([^/]*[^/\s])#]; 
        } 
        close $fh; 
    }