【问题标题】:Regular expression in Perl for email splittingPerl 中用于电子邮件拆分的正则表达式
【发布时间】:2012-02-29 10:47:57
【问题描述】:

我的同行问我,你将如何寻找最后一个 @if more than one@` 存在。

例子:

j@ssi@aliencoders.com@..coding.com

所以它应该显示j@ssi@aliencoders.com 作为用户名和..coding.com 作为域名。 Perl 中是否有任何一种线性正则表达式来获得所需的输出?

【问题讨论】:

    标签: regex perl email-validation


    【解决方案1】:
    my ($username, $domain) = $str =~ /(.*)@(.*)/;
    

    更多信息在perlre:

    默认情况下,量化的子模式是“贪婪的”,也就是说,它会 尽可能多地匹配(给定一个特定的起始位置) 同时仍然允许模式的其余部分匹配。

    【讨论】:

      【解决方案2】:

      只是利用贪心:

      /(.*)@(.*)$/
      

      第一部分将尽可能多地使用,直到遇到@。最后一部分将把 @ 后面的所有内容带到行尾。

      【讨论】:

      • 效率如何?我写了同样的东西,但我一直在寻找更好的解决方案,可以过滤掉文件中的每个此类邮件 ID。感谢 Koneark 的正则表达式 :)
      • 对“它的效率如何”的唯一真正答案是“对其进行基准测试”,但是像这样编译一个简单的正则表达式应该不成问题。 Perl 实际上是为正则表达式制作的。如果您认为另一种解决方案(可能是索引+子字符串?可能是拆分?)可能更快,也可以对它们进行基准测试:]
      【解决方案3】:

      默认情况下,Perl 中的量词是贪婪的。这意味着他们会尽可能多地抓住。

      你想要的很简单:

      ($username, $domain) = ($string =~ /(.*)@(.*)$/);
      

      如果你想 100% 确定第二部分没有@,你可以使用:

      ($username, $domain) = ($string =~ /(.*)@([^@]*)$/);
      

      【讨论】:

      • 最后一行有一些额外的东西。贪婪搜索很好,我认为它没有任何用处......所以你的第一个代码和第二个代码具有相同的效果。谢谢
      【解决方案4】:
      $str='j@ssi@aliencoders.com@..coding.com';
      $user=qw();
      $domain=qw();
      while($str=~m/\@/g){
          $user=$`;
          $domain=$';
      }
      print "user -> $user\n";
      print "domain->$domain\n";
      

      【讨论】:

      • 为什么要初始化$user$domain
      • 谢谢。如果你同时使用严格和警告模块,你需要初始化,这样你应该得到任何错误或警告。
      【解决方案5】:

      使用电子邮件::地址。这些事情对于简单的 re 来说太难了。糟糕,没有足够接近地阅读 op,但此代码适用于拆分电子邮件。

      use strict;
      use warnings;
      use Email::Address;
      
      my $line = 'bill@example.com;joe@example.com';
      my @addresses = Email::Address->parse($line);
      for my $address (@addresses) {
        print $address->format, "\n";
      }
      

      【讨论】:

      • 使用前需要安装Email::Address。默认情况下它不存在。否则,它是所有电子邮件验证工作的一个很酷的模块
      猜你喜欢
      • 2011-10-14
      • 2011-08-24
      • 2015-11-08
      • 1970-01-01
      • 1970-01-01
      • 2014-12-29
      • 2012-01-18
      • 2011-12-28
      • 2012-01-02
      相关资源
      最近更新 更多