Может ли кто-нибудь помочь мне переписать это регулярное выражение как неэкспоненциальное?
Я использую Perl для анализа данных электронной почты. Я хочу извлечь адреса электронной почты из данных. Вот сокращенная версия регулярного выражения, которое я использовал:
my $email_address = qr/(?:[^\s@<>,":;\[\]\(\)\\]+?|"[^\"]+?")@/i
Для простоты я удалил более позднюю часть домена в регулярном выражении. (Это не вызывает никаких проблем.)
При этом будет найден адрес электронной почты, совместимый с RFC, который содержит мета-символы, не относящиеся к электронной почте, или строку «в кавычках», за которой следует @. Используя OR '|' Часть регулярного выражения с двумя различными шаблонами с несколькими символами создает экспоненциальную проблему.
Проблема в том, что когда я раскрываю это в строке данных длиной в несколько тысяч символов.
$ wc line7.txt
1 221 497819 line7.txt
(извините, но я не могу предоставить входные данные в настоящее время, возможно, я смогу позже их смоделировать.)
Очень похоже на переписывание (a * b *) * в (a | b) *, мне нужно переписать это регулярное выражение.
Разделение его на два отдельных регулярных выражения создает больше работы по изменению кода, чем я готов выполнить на этом этапе. Хотя это решило бы мою проблему.
Возможный целевой компьютер находится в кластере Hadoop. Поэтому я бы хотел избежать модулей CPAN, которые не поставляются с версией Hadoop для Perl (Я должен проверить, можно ли вообще использовать Email :: Find.) Это проблема, с которой я столкнулся на работе.