Perl 验证文本文件中的电子邮件地址?

Perl 验证文本文件中的电子邮件地址?,perl,Perl,我试图搜索一个文本文件并找到有效的电子邮件地址。我在做这样的事情: #!/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}$/)

我试图搜索一个文本文件并找到有效的电子邮件地址。我在做这样的事情:

    #!/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;
$rfc5322 = qr{
    # etc
}x;
#/usr/bin/perl-w
my$infle='emails.txt';
打开,“<$infle”或“die”无法打开$infle:$!”;
而()
{ 
如果($infle=~/^[A-Z0-9.\%+-]+@[A-Z0-9.-]+\[A-Z]{2,6}$/)
{ 
打印“有效\n”;
} 
}
接近;

但是它没有任何作用,有什么帮助吗?

我不知道Perl,但是您的正则表达式匹配整个字符串的开头和结尾。除非您设置多行标志和/或每个文件只有一个电子邮件地址,否则您将无法获得结果

尝试删除^(字符串开头)和$(字符串结尾)标记,看看这是否有帮助


发布数据集示例也可能会有所帮助。由于没有示例,我无法进一步帮助您。

我不懂Perl,但您的正则表达式匹配整个字符串的开头和结尾。除非您设置多行标志和/或每个文件只有一个电子邮件地址,否则您将无法获得结果

尝试删除^(字符串开头)和$(字符串结尾)标记,看看这是否有帮助


发布数据集示例也可能会有所帮助。由于没有样品,我无法进一步帮助您。

您不需要这样的东西吗

@lines = <IN>;
close IN;

foreach $line (@lines)
{
...
}
@lines=;
接近;
foreach$行(@行)
{
...
}

你不需要这样的东西吗

@lines = <IN>;
close IN;

foreach $line (@lines)
{
...
}
@lines=;
接近;
foreach$行(@行)
{
...
}

将电子邮件地址regexp与文件名匹配。无论如何,您不应该使用regex来验证电子邮件地址-使用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;
使用严格;
使用电子邮件::有效;
my$infle='emails.txt';
打开我的$in,“<$infle”或“无法打开$infle:$!”;
while(我的$line=){
chomp$行;
如果(电子邮件::有效->地址($line)){
打印“有效\n”;
}
}
以美元收盘;

将电子邮件地址regexp与文件名匹配。无论如何,您不应该使用regex来验证电子邮件地址-使用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;
使用严格;
使用电子邮件::有效;
my$infle='emails.txt';
打开我的$in,“<$infle”或“无法打开$infle:$!”;
while(我的$line=){
chomp$行;
如果(电子邮件::有效->地址($line)){
打印“有效\n”;
}
}
以美元收盘;

您正在尝试匹配$infle,它包含文本文件的名称,即“emails.txt”

你应该这样做

while(<IN>) {
     print "Valid \n" if $_ =~ /\bYOURREGEX\b/
}
while(){
如果$\u=~/\bYOURREGEX\b,则打印“有效\n”/
}
这样\b将匹配单词边界,而不是行的开头和结尾,并且您可以匹配另一个字符串中包含的电子邮件地址

编辑:但吉拉的答案肯定更好,这一个只是告诉你出了什么问题


希望这有帮助

您正在尝试匹配$infle,它包含文本文件的名称,即“emails.txt”

你应该这样做

while(<IN>) {
     print "Valid \n" if $_ =~ /\bYOURREGEX\b/
}
while(){
如果$\u=~/\bYOURREGEX\b,则打印“有效\n”/
}
这样\b将匹配单词边界,而不是行的开头和结尾,并且您可以匹配另一个字符串中包含的电子邮件地址

编辑:但吉拉的答案肯定更好,这一个只是告诉你出了什么问题


希望这有帮助

此正则表达式将出现问题,除非:

  • 电子邮件地址是文件行中唯一的内容
  • 文件中的电子邮件地址均为大写 您应该用
    \p{Alpha}
    所有字母字符替换所有只接受大写的
    A-Z
    ,而不考虑大小写。您可以将其与
    0-9
    \uu
    组合使用。您应该将其替换为
    \w
    (任何单词字符)


    不过,这仍然不是一个有效的电子邮件正则表达式,请看——但它可能在必要时完成这项工作

    此正则表达式将出现问题,除非:

  • 电子邮件地址是文件行中唯一的内容
  • 文件中的电子邮件地址均为大写 您应该用
    \p{Alpha}
    所有字母字符替换所有只接受大写的
    A-Z
    ,而不考虑大小写。您可以将其与
    0-9
    \uu
    组合使用。您应该将其替换为
    \w
    (任何单词字符)

    不过,这仍然不是一个有效的电子邮件正则表达式,请看——但它可能在必要时完成这项工作

    你知道,这里有一份。看起来是这样的:

        #!/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;
    
    $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
    
    $boundary\u before=qr{(?=\w)(?
    这很少是人们所期望的。

    你知道,这里有一个副本。它看起来像这样:

        #!/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;
    
    $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
    
    $boundary\u before=qr{(?=\w)(?
    
    这很少是人们所期望的。

    要详细说明为什么这是正确的答案,您需要实际验证电子邮件地址的正则表达式。要详细说明为什么这是正确的答案,您需要实际验证电子邮件地址的正则表达式。您应该阅读RFC 5322()因为您缺少有效字符显示文件中是否嵌入了电子邮件地址?每行一个完整地址?分散在其他数据中?一行上是否有多个地址?一个电子邮件地址是否可以跨多行拆分?您应该阅读RFC 5322()因为您缺少有效字符,所以显示文件中嵌入的电子邮件地址?每行一个完整地址?分散在其他地址中吗