2010-11-24 106 views
1

我试图通过文本文件搜索并找到有效的电子邮件地址。我做这样的事情:从文本文件验证电子邮件地址?

#!/usr/bin/perl -w 

my $infile = 'emails.txt'; 

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

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

    close IN; 

但它没有做任何事情,任何帮助吗?

+1

由于缺少有效字符,您应该阅读RFC 5322(http://tools.ietf.org/html/rfc5322) – Benoit 2010-11-24 16:19:31

+0

电子邮件地址是如何嵌入到文件中的?每行有一个完整的地址?分散在其他数据?一条线上可以有多个地址吗?电子邮件地址是否可以分成多行? – Narveson 2010-11-24 16:57:04

回答

11

您将电子邮件地址regexp与文件名匹配。反正你不应该使用正则表达式验证电子邮件地址 - 用Email ::有效

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; 
0

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

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

这也可能有助于发布数据集样本。由于没有样本,我无法帮助你。

0

你不需要这样的东西吗?

@lines = <IN>; 
close IN; 

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

这是将文件混淆成一个数组。有时候有一个很好的理由,但在大多数情况下,读取文件的最好方法是像jira那样。 – Narveson 2010-11-24 16:53:01

1

你试图匹配$ INFILE,其中包含的文本文件,即“emails.txt”的名称。

你应该做这样的事情

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

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

编辑:但吉拉的答案肯定是更好的,这只是告诉你什么是错的。

希望这会有所帮助!

1

你必须与此正则表达式的问题,除非:

  1. 的电子邮件地址是在一条线上的文件
  2. 文件中的电子邮件地址全为大写的唯一的事情。

就应该替换所有A-Z,只接受帽,与\p{Alpha}无论案件的所有字母字符。你在哪里结合0-9_。您应该将其替换为\w(任何字符)。

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

这仍然不是电子邮件有效的正则表达式,不过,看到Benoit's comment - 但它可能在紧要关头做的工作。

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 

这很少是人们所期待的。

相关问题