2011-07-27 21 views
0

正規表現を使用して次の行から4番目のフィールド値(128)を抽出する必要があります。Perlでの正規表現

('29/11/2010 09:38:05', '41297', '29/11/2010 09:40:30', '128', '17', 'SUCCESS', '30', 'e', '9843171457', '1', '-1') 

第4番目の値を取得する方法を教えてください。

ありがとうございます。

+1

引用符をエスケープすることはできますか?もしそうなら、どうですか? – Cameron

+1

これは引用符で囲まれた値をカンマで区切った文字列なので、正規表現や分割ではなく、処理するように設計されたモジュールを使用するのが理にかなっています。以下のユージーンの答えを見てください。 – TLP

答えて

1

それはちょうどPerlの「分割」コマンド

$str = ('29/11/2010 09:38:05','41297','29/11/2010 09:40:30','128','17','SUCCESS','30','e', '9843171457','1','-1'); 

@vars = split(/','/,$str); 
print "${vars[3]}\n"; 
+0

文字列の中に引用符がある場合、これは機能しません – Cameron

+1

値はコンマで区切られ、引用符で囲まれているため、[Text :: CSV](http://search.cpan.org/~ makamaka/Text-CSV-1.21/lib/Text/CSV.pm) – TLP

+0

合意した...すべて彼の要求に依存します。 – AndyMac

2

強引な方法です:これは、非引用符、任意の数、そして別の引用符、コンマに続く引用は、ある

/'[^']*',\s*'[^']*',\s*'[^']*',\s*'([^']*)'/ 

いくつかのオプションの空白。それをキャプチャするために4回目の値の周りに()で4回繰り返します。値に引用符を付けることが許可されている場合、これは機能しない可能性があります。

キャメロンが指摘したように、あなたが使用して重複を避けることができます。

/(?:'[^']*',\s*){3}'([^']*)'/ 

?:は、括弧の中のものをキャプチャするために正規表現パーサないを伝えます。

カンマを区切り文字としてsplitを使用してリストを分割してから、4番目の要素を取るほうが簡単でしょう。もちろん、値の中にコンマを置くことができれば、それはうまくいかないかもしれません。

+0

tic-comma-ticを持つことが保証されていれば、それはコンマよりも優れた区切り文字です...最初と最後のフィールドの先頭と末尾の括弧を取り除くことはできませんが、いくつかの要件が不足している;)。 – AndyMac

+1

これは '/(?: '[^'] * '、\ s *){3}'([^ '] *)' /' – Cameron

+0

に短縮することができます。改善。 –

7

CPANから利用Text::CSV

my $input = "('29/11/2010 09:38:05', '41297', '29/11/2010 09:40:30', '128', '17', 'SUCCESS', '30', 'e', '9843171457', '1', '-1')"; 

my $csv = Text::CSV->new({ 
    quote_char  => "'", 
    always_quote  => 1, 
    allow_whitespace => 1, 
}); 
$csv->parse($input); 
my @columns = $csv->fields(); 
print $columns[3], "\n"; # 128 
+0

これを試してみると、いくつかのパディングがあります。文字列は '' '128' ''です。スペースと単一引用符。モジュールでそれを取り除く方法があるかどうかをチェックするつもりでしたが、今はあなたの答えです。 ;) – TLP

+0

@TLP:修正済み、更新されたバージョンを参照してください。 –

+0

+1とてもいいです。私は次回までそれを覚えておく必要があるので、速く入力することができます。 ;) – TLP