2012-04-11 30 views
2

私は、行単位でファイルを読み込むことによって作成される文字列をトリムすることを検討しています。しかし、私は文字列から電子メールを取り出したいが、それは毎回変更されます。唯一の定数はドメインです(例:@domain.com)。Perlでは、ログファイルの行からどのように電子メールアドレスを抽出できますか?

ので

00:00:50,004 ERROR [SynchronousCallback] Cannot process resource: [email protected] Channel: channel16 

の入力文字列のための正規表現は何@domain.comを探し、すべての[email protected]を引き出します。 Iveは文字列m/@domain.com/iを探す正規表現を持っていますが、一度@domain.comが文字列全体に配置されていれば、文字列を操作する方法はわかりません。

私は希望の出力は、単に電子メール[email protected]

+0

は '/(.*[email protected] domain.com)/ i'は$ 1の内部に)うまくいけば(全体の電子メールアドレスをキャプチャする、最も単純なバージョンになります。 –

答えて

7
#!/usr/bin/env perl 

use strict; use warnings; 
use Email::Address; 


while (my $line = <DATA>) { 
    my ($addr) = Email::Address->parse($line); 
    print $addr->address, "\n"; 
} 

__DATA__ 
00:00:50,004 ERROR [SynchronousCallback] Cannot process resource: [email protected] Channel: channel16 

出力:

C:\temp> tt 
[email protected]
3

はいつもすぐにメールアドレスの前に空白はありますでしょうか?もしそうなら、あなたのようなものを使用することができます

m/\s([^\s\@]+\@domain.com)/i 

を次に、あなたは$1を見ることで、全体の電子メールアドレスを取得することができます。あなたが正規表現のために(1行に1つ以上の電子メール)のすべての結果が必要な場合

+0

ありがとうございました...夢のように動作します! – MMKD

+0

'@ domain'の配列を正規表現に補間するので、これは機能しません。失敗するか、間違った結果が生成されます。 – Borodin

+0

@Borodin:Fixed –

0

あなたはこれを行うことができます:

while ($str =~ s# ([^ ]+\@domain.com)##i){ 
    my $email = $1; 
    print $email."\n"; 
} 

に関して、

+0

ありがとう、返信ありがとうございました。しかし、このインスタンスのための素晴らしい解決策は、1行に1つの電子メールだけです。 – MMKD

0

/\S+\@domain\.com/を使用して、ドメイン文字列の前にある空白以外の文字をすべてキャプチャする必要があるようです。このプログラムは原則を示しています。

my $s = '00:00:50,004 ERROR [SynchronousCallback] Cannot process resource: [email protected] Channel: channel16'; 
print "$_\n" for $s =~ /\S+\@domain\.com/gi; 

出力

[email protected] 
関連する問題