从文本文件中读取有效的电子邮件地址

3

我是一名有用的助手,可以为您进行翻译。以下是需要翻译的内容:

我有一个纯文本文件。要求从文本文件中读取有效的电子邮件地址。

文本文件不包含任何特殊字符,每行只包含一个单词。

示例

test1
test@yahoo.com
test2
test@gmail.com

我尝试按以下方式读取文本文件:

var emails = File.ReadAllLines(@"foo.txt");

但是无法找到如何从文本文件中提取有效的电子邮件。

我正在使用C#4.0


对于C#:https://dev59.com/0m435IYBdhLWcg3wkA5e - dannrob
5个回答

6

如果你的电子邮件地址中只有一个 @ 字符,你可以使用以下方法:

var emails = File.ReadAllLines(@"foo.txt").Where(line => line.Contains("@"));

好的,我承认。这是我见过的最糟糕的电子邮件验证:)让我们更深入地了解一下。您可以使用MailAddress类检查您的连接。让我们定义一个用于检查电子邮件地址是否有效的方法,如下;

public bool IsValidMailAddress(string s)
{
    try
    {
        MailAddress m = new MailAddress(s);
        return true;
    }
    catch (FormatException)
    {
        return false;
    }
}

然后我们可以使用;
var emails = File.ReadAllLines(@"foo.txt").Where(line => IsValidMailAddress(line));

1
@aiapatag 这就是我说“只有你的电子邮件行中有@”的原因。 - Soner Gönül
1
你还在结尾处漏了一个括号。 - kostas ch.
对我来说有点过度杀伐了。无论我的应用程序实际需要什么,我都不会只为获取一个函数而添加命名空间的引用。我建议仅在需要使用SMTP发送电子邮件时才使用System.Net.Mail命名空间。[MSDN] (http://msdn.microsoft.com/en-us/library/dk1fb84h.aspx) - aiapatag

2
你可以使用正则表达式来完成这个任务。请参考MSDN示例
来自MSDN的摘录:
   public bool IsValidEmail(string strIn)
   {
       invalid = false;
       if (String.IsNullOrEmpty(strIn))
          return false;

       // Use IdnMapping class to convert Unicode domain names. 
       try {
          strIn = Regex.Replace(strIn, @"(@)(.+)$", this.DomainMapper,
                                RegexOptions.None, TimeSpan.FromMilliseconds(200));
       }
       catch (RegexMatchTimeoutException) {
         return false;
       }

       if (invalid) 
          return false;

       // Return true if strIn is in valid e-mail format. 
       try {
          return Regex.IsMatch(strIn, 
                @"^(?("")(""[^""]+?""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" + 
                @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9]{2,17}))$", 
                RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
       }  
       catch (RegexMatchTimeoutException) {
          return false;
       }
   }

然后通过以下方式使用它:

 var emails = File.ReadAllLines(@"foo.txt");
 foreach(var line in emails)
 {
     if(IsValidEmail(line))
     { //do something with the valid email
     }
 }

2

您好,使用正则表达式来过滤有效的电子邮件地址。

以下是示例代码。

var emails = File.ReadAllLines(@"foo.txt")
                       .Where(x => x.IsValidEmailAddress());

public static class extensionMethods
    {
        public static bool IsValidEmailAddress(this string s)
        {
            Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
            return regex.IsMatch(s);
        }
    }

2

你做的没错。你正在调用ReadAllLines方法,该方法已经返回了数组。你只需要使用foreach循环,如下所示:

var emails = File.ReadAllLines(@"foo.txt");
foreach (var email in emails)
{
    //write validation logic of emails here
}

点击这里了解更多信息,与C#相关的技术问题,如何将文件读取行转换为字符串数组。

0

这取决于你对“有效”的定义。有些人采取简单的方法,只需在字符串中查找一个“@”和至少一个点号“.”。其他人则更深入地验证电子邮件地址,并尝试根据RFC 822的规范进行验证。

看起来,简单的方法适合您的需求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接