2

ファイルを1行ずつ読み込んで作成される文字列をトリミングしたいと考えています。ただし、文字列からメールだけを取り出したいのですが、毎回変わります。たとえば、唯一の定数はドメインです@domain.com

したがって、の入力文字列については

 00:00:50,004 ERROR [SynchronousCallback] Cannot process resource: test.test@domain.com  Channel: channel16

正規表現が探し@domain.comてすべてを引き出すものtest.test@domain.com。文字列を検索する正規表現を持っていますが、文字列全体に配置されたm/@domain.com/i後、文字列を操作する方法がわかりません。@domain.com

私が望む出力はただの電子メールですtest.test@domain.com

4

4 に答える 4

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: test.test@domain.com  Channel: channel16

出力:

C:\ temp> tt
test.test@domain.com
于 2012-04-11T16:40:06.897 に答える
3

電子メールアドレスの直前には常に空白がありますか?もしそうなら、あなたは次のようなものを使うことができます:

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

次に、を見て、電子メールアドレス全体を取得できます$1

于 2012-04-11T16:25:45.490 に答える
0

正規表現のすべての結果(1行に複数の電子メール)が必要な場合は、次のようにすることができます。

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

よろしく、

于 2012-04-11T16:36:01.440 に答える
0

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

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

出力

test.test@domain.com
于 2012-04-11T16:43:00.977 に答える