正規表現を使用して次の行から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番目の値を取得する方法を教えてください。
ありがとうございます。
正規表現を使用して次の行から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番目の値を取得する方法を教えてください。
ありがとうございます。
それはちょうど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";
強引な方法です:これは、非引用符、任意の数、そして別の引用符、コンマに続く引用は、ある
/'[^']*',\s*'[^']*',\s*'[^']*',\s*'([^']*)'/
いくつかのオプションの空白。それをキャプチャするために4回目の値の周りに()
で4回繰り返します。値に引用符を付けることが許可されている場合、これは機能しない可能性があります。
キャメロンが指摘したように、あなたが使用して重複を避けることができます。
/(?:'[^']*',\s*){3}'([^']*)'/
?:
は、括弧の中のものをキャプチャするために正規表現パーサないを伝えます。
カンマを区切り文字としてsplit
を使用してリストを分割してから、4番目の要素を取るほうが簡単でしょう。もちろん、値の中にコンマを置くことができれば、それはうまくいかないかもしれません。
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
引用符をエスケープすることはできますか?もしそうなら、どうですか? – Cameron
これは引用符で囲まれた値をカンマで区切った文字列なので、正規表現や分割ではなく、処理するように設計されたモジュールを使用するのが理にかなっています。以下のユージーンの答えを見てください。 – TLP