3

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

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

样本

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

我试图按如下方式阅读文本文件,

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

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

我正在使用 C# 4.0

4

5 回答 5

6

如果只有您的电子邮件行有@字符,您可以使用

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

好吧,我承认。这是我见过的最糟糕的电子邮件验证:)让我们更深入。您可以使用MailAddressclass 检查您的线路。让我们定义一个检查电子邮件地址是否有效的方法;

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));
于 2013-06-18T11:17:45.230 回答
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
     }
 }
于 2013-06-18T11:15:14.917 回答
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);
        }
    }
于 2013-06-18T11:17:50.387 回答
2

你做得对。您正在调用ReadAllLines方法,该方法array已返回。只有你需要做一个 foreach 循环。作为:

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

单击此处以获得更好的理解。

于 2013-06-18T11:20:32.910 回答
0

这取决于您所说的有效。有些人采取一种简单的方法,只寻找一个“@”和至少一个“.”。在字符串中。其他人则更进一步地进行电子邮件验证,并尝试根据RFC 822验证地址

看起来简单的方法可以满足您的需求。

于 2013-06-18T11:18:14.397 回答