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

时间:2010-11-24 16:06:56

标签: 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}$/) 
        { 
            print "Valid \n"; 
        } 
    }

    close IN;

但它什么都没做,有什么帮助吗?

6 个答案:

答案 0 :(得分:11)

您将电子邮件地址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;

答案 1 :(得分:1)

您正在尝试匹配$ infile,其中包含文本文件的名称,即'emails.txt'。

你应该做类似

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

这样\ b匹配单词边界而不是行的开头和结尾,您可以匹配另一个字符串中包含的电子邮件地址。

编辑:但是Jira的回答肯定更好,这个只是告诉你什么是错的。

希望这有帮助!

答案 2 :(得分:1)

除非符合以下条件,否则您将遇到此正则表达式的问题:

  1. 电子邮件地址是文件行中唯一的内容
  2. 文件中的电子邮件地址全部为大写。
  3. 您应该将所有A-Z替换为\p{Alpha}所有字母字符,只接受上限,无论大小写如何。将其与0-9_合并的位置。您应该将其替换为\w(任何字符)。

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

    但这仍然不是电子邮件的有效正则表达式,请参阅Benoit's comment - 但它可能会在紧要关头完成工作。

答案 3 :(得分:0)

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

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

也可能有助于发布数据集样本。如果没有样品,我无法再帮助你。

答案 4 :(得分:0)

你不需要这样的东西吗?

@lines = <IN>;
close IN;

foreach $line (@lines)
{
...
}

答案 5 :(得分:0)

你知道, 是这里的the regex to validate RFC 5322 email addresses的副本。它看起来像这样:

$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

这很少是人们所期待的。

相关问题