【问题标题】:Extract email from a text file从文本文件中提取电子邮件
【发布时间】:2013-05-03 14:20:44
【问题描述】:

当以这种形式编写时,从文本文件中提取电子邮件地址的正确 perl regulat 表达式是什么

someone at something.domainextension 或 someone.someone at something.domainextension

是否有可能有一个正则表达式将这些地址转换为普通的电子邮件地址?

提前感谢

【问题讨论】:

  • 这是一个重复的问题,你会在 stackoverflow 中找到很多答案。请记住,虽然不能使用正则表达式完成正确的电子邮件验证,但也不应该这样做。见regular-expressions.info/email.html
  • @Aleksi - 不完全是。他指出,文件中的电子邮件地址不是 RFC 5322 格式,而是“someone at something.domainextension OR someone.someone at something.domainextension”。因此,这可以通过正则表达式轻松解决,并且不适用典型的电子邮件正则表达式警告。

标签: regex email


【解决方案1】:

我使用 Ruby,但在 Perl 中也是如此

>> "someone.someone at something.domainextension".sub(/\bat\b/,"@").gsub(/\s+/,"")
=> "someone.someone@something.domainextension"

基本上只需将“at”替换为“@”并删除所有空格。

【讨论】:

    【解决方案2】:
    /^(?:(\w+)\.)?(\w+)\s+at\s+(\w+)\.(\w+)$/
    

    这不会捕获所有电子邮件地址,只会捕获您提供的表单中的那些。

    【讨论】:

      【解决方案3】:

      我相信下面的代码可以完成你的任务。但是,如果您的电子邮件地址是跨行拆分的,它将不起作用,如果您只有一个“at something.com”,它也会给您一个误报,如果您可以发布,我可以使此代码更具体地处理您的情况您的数据集中的一些样本数据。

      正如上面评论中所指出的,这不会绝对找到在 RFC 下有效的每个电子邮件地址,但我认为它应该可以解决您的问题。

      my @lines_from_file; #holds our test info
      
      #load the test info
      $lines_from_file[0] = 'this is some text.  We like to type to someone at somthing.com but sometimes';
      $lines_from_file[1] = 'they go by someone.someone at something.com just to confuse us and hey you never';
      $lines_from_file[2] = 'know, maybe they use parens like (someone at something.com).';
      $lines_from_file[3] = 'make sure we do not find someone at .com. or someone something.com or someone at somethingcom';
      
      my @all_email_addresses; #holds all found email addresses
      
      
      #foreach line in the file
      foreach my $line (@lines_from_file){
          while($line =~ /([0-9a-zA-Z.]+)    #capture any number or letter or dot 1 or more times
                          \sat\s             #" at "
                          ([0-9a-zA-Z.]+     #capture any number or letter or dot 1 or more times
                          \.                 #dot
                          \w{2,4})           #com or net or us or tv or info etc., 
                         /xg){
              #everytime the line matches an email save the email in email form
              push @all_email_addresses, "$1\@$2" ;
          }
      
      }
      
      print "@all_email_addresses";
      

      【讨论】:

        猜你喜欢
        • 2014-03-23
        • 2011-05-15
        • 2018-03-13
        • 2018-07-30
        • 1970-01-01
        • 1970-01-01
        • 2016-04-12
        • 1970-01-01
        相关资源
        最近更新 更多