Проверить адрес электронной почты из текстового файла? - PullRequest
1 голос
/ 24 ноября 2010

Я пытаюсь найти текстовый файл и найти действительные адреса электронной почты. Я делаю что-то вроде этого:

    #!/usr/bin/perl -w

my $infile = 'emails.txt';

    open IN, "< $infile" or die "Can't open $infile : $!";

    while( <IN> )
    { 
        if ($infile =~ /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$/) 
        { 
            print "Valid \n"; 
        } 
    }

    close IN;

Но это ничего не делает, любая помощь?

Ответы [ 6 ]

11 голосов
/ 24 ноября 2010

Вы сопоставляете адрес электронной почты regexp с именем файла.И в любом случае вы не должны использовать регулярные выражения для проверки адреса электронной почты - используйте Email :: Valid

use strict;

use Email::Valid;

my $infile = 'emails.txt';

open my $in, "< $infile" or die "Can't open $infile : $!";

while(my $line = <$in> ) {

    chomp $line;

    if (Email::Valid->address($line)) {

        print "Valid \n";

    }


}

close $in;
1 голос
/ 24 ноября 2010

У вас будут проблемы с этим регулярным выражением, если:

  1. Адрес электронной почты - это единственное, что есть в строке файла
  2. Адрес электронной почты в файле - все заглавные буквы,

Вы должны заменить все A-Z, которые принимают только заглавные буквы, на \p{Alpha} всех буквенных символов независимо от регистра.Где вы сочетаете это с 0-9 и _.Вместо этого вам следует заменить его на \w (любой слово символ).

/^[\w.%+-]+@[\p{Alnum}.-]+\.\p{Alpha}{2,6}$/

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

1 голос
/ 24 ноября 2010

Вы пытаетесь сопоставить $ infile, который содержит имя текстового файла, то есть 'emails.txt'.

Вы должны сделать что-то вроде

while(<IN>) {
     print "Valid \n" if $_ =~ /\bYOURREGEX\b/
}

Этопуть \ b соответствует границам слов вместо начала и конца строки, и вы можете сопоставлять адреса электронной почты, содержащиеся в другой строке.

РЕДАКТИРОВАТЬ: Но ответ Джиры определенно лучше, этот просто говорит вам, что не так.

Надеюсь, это поможет!

0 голосов
/ 24 ноября 2010

Там является копией регулярного выражения для проверки адресов электронной почты RFC 5322 здесь, на SO, вы знаете.Это выглядит так:

$rfc5322 = qr{
    # etc
}x;

У него есть одна или две вещи в # etc праве, которое я сделал выше, что вы можете проверить в другом ответе.Кстати, если вы собираетесь использовать \b в своих регулярных выражениях, пожалуйста, будьте особенно осторожны, чтобы вы знали, что это трогает.

$boundary_before     =  qr{(?(?=\w)(?<!\w)|(?<=\w))}; # like /\bx/
$boundary_after      =  qr{(?(?<=\w)(?!\w)|(?=\w))};  # like /x\b/
$nonboundary_before  =  qr{(?(?=\w)(?<=\w)|(?<!\w))}; # like /\Bx/
$nonboundary_after   =  qr{(?(?<=\w)(?=\w)|(?!\w))};  # like /x\B

Это редко, что люди ожидают.

0 голосов
/ 24 ноября 2010

Разве тебе не нужно что-то подобное?

@lines = <IN>;
close IN;

foreach $line (@lines)
{
...
}
0 голосов
/ 24 ноября 2010

Я не знаю Perl, но ваше регулярное выражение соответствует началу и концу всей строки.Если вы не установите многострочный флаг и / или не будете иметь только один адрес электронной почты на файл, вы не получите результаты.

Попробуйте удалить токены ^ (начало строки) и $ (конец строки) ипосмотрите, поможет ли это.

Может также помочь опубликовать образец набора данных.Как и без образца, я не могу вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...