2012-04-11 1 views
2

Я ищу, чтобы обрезать строку, которая будет создана из чтения в файле по строкам. Однако я хочу вытащить только электронную почту из строки, но она будет меняться каждый раз. Единственным условием является домен, например @domain.com.В Perl, как я могу извлечь адреса электронной почты из строк в файлах журналов?

Таким образом, для входной строки

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

Что регулярное выражение будет искать @domain.com и вытащить все [email protected]. Я получил регулярное выражение, которое будет искать строку 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.

+0

Отлично, спасибо большое ... работает как сон! – MMKD

+0

Это не будет работать, поскольку оно будет интерполировать массив '@ domain' в регулярное выражение. Это либо провалится, либо приведет к неправильным результатам. – Borodin

+0

@Borodin: Исправлено: –

0

Если вам нужно все результат (более чем один адрес электронной почты в строке) для регулярных выражений вы можете сделать это:

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

С уважением,

+0

Большое спасибо, за ответ. Это приятное решение, однако для этого экземпляра будет только одна электронная почта в каждой строке. – 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] 
Смежные вопросы