我有这种格式的字符串,如下所示:
"mark345345@test.com;rtereter@something.com;terst@gmail.com;fault@mail"
如果它是无效的电子邮件,那么验证上述每种方法的最有效方法是什么?失败?
答案 0 :(得分:2)
您可以使用EmailAddressAttribute
类System.ComponentModel.DataAnnotations
命名空间来验证电子邮件地址。在此之前,您需要拆分单个邮件并检查它是否有效。以下代码将帮助您分别收集有效邮件和无效邮件。
List<string> inputMails = "mark345345@test.com;rtereter@something.com;terst@gmail.com;fault@mail".Split(';').ToList();
List<string> validMails = new List<string>();
List<string> inValidMails = new List<string>();
var validator = new EmailAddressAttribute();
foreach (var mail in inputMails)
{
if (validator.IsValid(mail))
{
validMails.Add(mail);
}
else
{
inValidMails.Add(mail);
}
}
答案 1 :(得分:0)
您可以使用Regex,也可以将字符串拆分为';'
,并尝试为每个地址创建一个System.Net.Mail.MailAddress
实例。如果地址不是可识别的格式,则会发生FormatException
。
答案 2 :(得分:0)
如果您确定所有电子邮件都是半冒号分隔的,您可以将其拆分并列出所有电子邮件。验证每封电子邮件的最佳方法是使用正则表达式模式。我用过这个:
var emailPattern = @"(?=^.{1,64}@)^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?=.{1,255}$|.{1,255};)(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])(;(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?=.{1,255}$|.{1,255};)(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9]))*$";
var incomingString = "mark345345@test.com;rtereter@something.com;terst@gmail.com;fault@mail";
var emails = incomingString.Split(';').ToList();
foreach (var email in emails)
{
if (new Regex(emailPattern).IsMatch(email))
{
// your logic here
}
}
答案 3 :(得分:0)
由于.Net具有验证电子邮件ID的开箱即用方式,因此我不会使用正则表达式并依赖.Net。例如来自EmailAddressAttribute
的{{1}}。
一个干净的方式来使用它将是这样的:
System.ComponentModel.DataAnnotations
这将为您提供2个组,var emailAddressAttribute = new EmailAddressAttribute();
var groups = yourEmailsString.Split(new [] { ';' }, StringSplitOptions.RemoveEmptyEntries)
.GroupBy(emailAddressAttribute.IsValid);
的组将是有效的电子邮件ID
Key == true
var validEmailIds = groups.Where(group => group.Key)
.SelectMany(group => group);
的邮件将是无效的电子邮件ID
Key == false
根据您的需要,您也可以在分组后运行for循环..