#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. Потребовалось немного, но получилось отобразить его на сайте.