Perl регулярное выражение для почтового адреса - PullRequest
2 голосов
/ 13 мая 2011

У меня возникли проблемы с записью регулярного выражения для этих строк в журнале exim

 1. 2011-05-12 11:30:26 1QKRHt-0001aD-Vd => mail <mail@mail.example.com> F=<root@example.com> bla bla 
 2. 2011-04-22 12:01:31 1QDCF0-0002ss-Nw => /var/mail/mail <root@mail.mealstrom.org.ua> F=<root@example.com> bla bla 
 3. 2011-05-12 11:29:01 1QKRGU-0001a5-Ok => mail@mail.example.com F=<root@example.com> bla bla

, и я хочу поместить переменную this mail@mail.example.com в одно регулярное выражение.я попытался использовать логику так: найти последнюю строку перед 'F =', разделенную пробелами и может быть заблокирована в <>

Можете ли вы помочь мненаписать эту логику?

Ответы [ 4 ]

2 голосов
/ 13 мая 2011

Вы можете использовать следующее регулярное выражение:

# the line should be in variable $line
if ($line =~ /.*?\s+<?(\S+?)>?\s+F=/) {
  # ...
}

И тогда будет хорошей идеей проверить соответствие с помощью Mail-RFC822-Address модуля perl, чтобы полный код могбыть:

use Mail::RFC822::Address qw(valid);

# the line should be in variable $line
if ($line =~ /.*?\s+<?(\S+?)>?\s+F=/) {
  if (valid($1)) {
    # ...
  }
}
1 голос
/ 13 мая 2011

Использование:

/(?<=<)\S*(?=>\s*F=)/

Синтаксис (?<= xxx ) - это предположение, а (?= xxx ) - это упреждающее утверждение.

это не будет проверять действительность адреса электронной почты , просто извлеките эту часть строки.

0 голосов
/ 13 мая 2011

Regex не является мерой, E-mail :: Действительный is.

0 голосов
/ 13 мая 2011

Вот регулярное выражение проверки электронной почты

\b[\w\.-]+@[\w\.-]+\.\w{2,4}\b

. Оно извлечет письмо из любого места.

Надеюсь, этот RFC2822 один отправляет правильно.

[a-z0-9!#$%&'*+/=?^_\`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)\*@(?:\[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+\[a-z0-9](?:[a-z0-9-]\*[a-z0-9])?
...