perl regexp для почтового адреса

#regex #perl #parsing #logging #exim

#регулярное выражение #perl #синтаксический анализ #ведение журнала #пример

Вопрос:

у меня возникли некоторые проблемы с записью регулярного выражения для этих строк в журнале 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
  

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

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

Комментарии:

1. Если вы хотите проверить адреса электронной почты в соответствии с RFC 822 , это совсем не просто, хорошее регулярное выражение невероятно длинное

Ответ №1:

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

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

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

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

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

Комментарии:

1. я использовал этот пакет для проверки электронных писем. и ваше регулярное выражение работает. вы внесли свой вклад в этот проект: D github.com/mealstrom/plp2sql электронные письма действительны, потому что они уже есть в журнале.

Ответ №2:

Использовать:

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

(?<= xxx ) Синтаксис — это утверждение «назад», а (?= xxx ) — утверждение «вперед».

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

Ответ №3:

Регулярное выражение не является мерой, Email::Valid является.

Ответ №4:

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

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

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

Я надеюсь, что этот RFC2822 публикуется правильно.

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

Комментарии:

1. Я думаю, что здесь отсутствуют некоторые квадратные скобки в части после @ для определения классов символов

2. Похоже, что оно не публикуется, по какой-то причине оно продолжало сокращаться. Вместо этого я добавил другое.

3. это нестандартно. Например, foo bar@gmail.com это допустимый адрес электронной почты, и вы его не поддерживаете. Посмотрите на это !

4. Мне удалось опубликовать запрос RFC2822. Потребовалось немного, но получилось отобразить его на сайте.