【问题标题】:Perl regex email addressPerl 正则表达式电子邮件地址
【发布时间】:2013-10-21 14:41:20
【问题描述】:

这是我的电子邮件正则表达式的伪代码: 多个字符 + 一个 @ 符号 + 多个字符 + 一个 .符号 + 2 到 6 个字符的单词

此电子邮件前后必须有 1 个空格 您可以每行有多个电子邮件,并阅读整个文件的电子邮件。

到目前为止:

open (MYFILE, 'data.txt');
while (<MYFILE>) {
    chomp;
    my @words = split(' ');
    foreach my $word (@words) {  
        if($word =~ /.+@.+\..{2,6}/) {
            print "$_\n";  
        }
    }
}

我认为我的问题在于我的正则表达式以及我对文件的阅读。 我想我把每一行都变成了一个字符串,因为一些结果像 blah@blah.com blah 出现了,所以单词没有分开?

【问题讨论】:

标签: regex perl email-validation


【解决方案1】:

使用Email::Valid

use Email::Valid;
open (MYFILE, 'data.txt');
while (<MYFILE>) {
    chomp;
    my @words = split(' ');
    foreach my $word (@words) {  
        if(Email::Valid->address($word)) {
            print "$word\n";  
        }
    }
}

【讨论】:

  • 我想自己使用正则表达式,而不仅仅是使用模块:)
  • @Jason,这是个坏主意
  • @Jason 重新使用遵循官方规范的现有实现总是比推出自己的半途而废的解决方案更可取(在一些危险的错误甚至安全问题出现之前,这一切都是有趣和游戏)。但是,RFC 822 被 RFC 2822 取代,而 RFC 2822 又被 RFC 5332 取代。 RFC 2822 由 Email::Address 模块实现,该模块应用于代替 Mail::RFC822::Address。
  • @amon true,出于验证目的,可能需要使用 Email::Valid 来代替。我更新了我的答案。
  • @Jason 那么您可能想看看Regular Expressions Cookbook,它将详细解释它。但是您不想自己构建正则表达式,它太复杂且容易出错。
【解决方案2】:

我用我的:

^[a-zA-Z0-9]+(\.?[\*\+\-\_\=\^\$\#\!\~\?a-zA-Z0-9])*\.?\@([a-zA-Z0-9]+[a-zA-Z0-9\-]*[a-zA-Z0-9]+)(\.[a-zA-Z0-9]+[a-zA-Z0-9\-]*[a-zA-Z0-9]+)*\.(?:([a-zA-Z0-9]+)|([a-zA-Z0-9]+[a-zA-Z0-9\-]*[a-zA-Z0-9]+))$

我希望它有所帮助。干杯。

【讨论】:

  • 伙计们,你们怎么了?为什么你不赞成这个答案?这不是正确的吗?它运行良好,可与 99.9% 的全球电子邮件地址相媲美。你能确定你投反对票的原因吗?
  • 滚动您自己的电子邮件地址验证器是个坏主意,故事结束。要么验证规范,要么只确保字段中有@ 符号。归根结底,唯一万无一失的检查就是发送一封实际的电子邮件。
【解决方案3】:

您的打印语句不会打印拆分 $word 中的单词,它会打印拆分 $_ 之前的原始行。

print "$_\n";  

你可能想要的是

print "$word\n";

【讨论】:

  • 谢谢你,解决了最后一部分,但我的表达仍然关闭,我希望电子邮件地址的最后一部分只包含字符 [A-Za-z] 我如何添加它?
  • 这是你的问题?那么,为什么不使用[A-Za-z] 而不是. 呢?
  • /.+@.+\..{2,6}/ 是我所拥有的,但如果我尝试 /.+@.+\.[A-Za-Z]{2,6 }/ 没有任何变化,最后加上 @ 仍然匹配
  • 您是否说“添加”并表示它是“地址”的缩写?不,该正则表达式无法匹配以 @ 结尾的字符串。
  • 可以,如果有多个@比如someone@somedomain.example@,就可以匹配。您需要正确地anchor 正则表达式(使用^$),然后考虑可能发生的所有其他事情,例如IDN。我强烈建议不要在任何生产代码中使用这个正则表达式。
【解决方案4】:
open (MYFILE, 'data.txt');
while (<MYFILE>) {
    chomp;
    my @words = split(' ');
    foreach my $word (@words) {
        if($word =~ /^[^@]+@+[^\.]+\.+[^\.]{2,6}$/) {
            print "$word\n";
        }
    }
}

首先我想指出,像mine@mine.co.uk 这样的有效电子邮件ID 很少不符合您的要求。因此,始终建议使用现有的工作模块。

如果您打算像我一样玩regex 并学习,那么请考虑上面的代码。

我的 data.txt 文件如下所示:

me@me.com mine@mine.co.uk myself@email.net
me@me.com mine@mine.in myself@email.ru
me@me.com mine@mine.co.uk myself@email.america

输出

me@me.com
myself@email.net
me@me.com
mine@mine.in
myself@email.ru
me@me.com

【讨论】:

    猜你喜欢
    • 2011-08-24
    • 1970-01-01
    • 2012-01-25
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 2011-05-20
    相关资源
    最近更新 更多