C# 正则表达式验证电子邮件分号分隔列表?

C# 正则表达式验证电子邮件分号分隔列表?,c#,regex,validation,email,delimited-text,C#,Regex,Validation,Email,Delimited Text,我有以下c#扩展方法来验证电子邮件地址。正则表达式来自微软的How-to:Verify,字符串是否为有效的电子邮件格式页面 我需要改进这个方法,以便能够处理分号分隔的电子邮件列表。一个有效的示例字符串的格式可能会像:;;xxx.sss.xxx;;;xxx.sss.xxx // ///验证字符串是否为电子邮件地址。。。 /// /// ///布尔 公共静态bool IsValidEmailAddress(此字符串emailAddress) { var valid=true; var isnot

我有以下c#扩展方法来验证电子邮件地址。正则表达式来自微软的How-to:Verify,字符串是否为有效的电子邮件格式页面

我需要改进这个方法,以便能够处理分号分隔的电子邮件列表。一个有效的示例字符串的格式可能会像:;;xxx.sss.xxx;;;xxx.sss.xxx

//
///验证字符串是否为电子邮件地址。。。
/// 
/// 
///布尔
公共静态bool IsValidEmailAddress(此字符串emailAddress)
{
var valid=true;
var isnotblank=false;
var email=emailAddress.Trim();
如果(email.Length>0)
{
isnotblank=true;

valid=Regex.IsMatch(email,@“^(?”(“”)“+?(?微软的Regex做得很好。但是,它没有捕捉到一些奇怪的场景和一些对电子邮件有效的特殊字符。我将给你一个不同的Regex。选择是否使用它是你的特权

我会通过使用一个扩展方法验证电子邮件地址和另一个扩展方法验证列表来区分这些问题。在将每个电子邮件传递给电子邮件验证方法之前,对其执行.trim()。因此,类似这样的操作:

    /// <summary>
    /// Validates the string is an Email Address...
    /// </summary>
    /// <param name="emailAddress"></param>
    /// <returns>bool</returns>
    public static bool IsValidEmailAddress(this string emailAddress)
    {
        var valid = true;
        var isnotblank = false;

        var email = emailAddress.Trim();
        if (email.Length > 0)
        {
            // Email Address Cannot start with period.
            // Name portion must be at least one character
            // In the Name, valid characters are:  a-z 0-9 ! # _ % & ' " = ` { } ~ - + * ? ^ | / $
            // Cannot have period immediately before @ sign.
            // Cannot have two @ symbols
            // In the domain, valid characters are: a-z 0-9 - .
            // Domain cannot start with a period or dash
            // Domain name must be 2 characters.. not more than 256 characters
            // Domain cannot end with a period or dash.
            // Domain must contain a period
            isnotblank = true;
            valid = Regex.IsMatch(email, @"\A([\w!#%&'""=`{}~\.\-\+\*\?\^\|\/\$])+@{1}\w+([-.]\w+)*\.\w+([-.]\w+)*\z", RegexOptions.IgnoreCase) &&
                !email.StartsWith("-") &&
                !email.StartsWith(".") &&
                !email.EndsWith(".") && 
                !email.Contains("..") &&
                !email.Contains(".@") &&
                !email.Contains("@.");
        }

        return (valid && isnotblank);
    }

    /// <summary>
    /// Validates the string is an Email Address or a delimited string of email addresses...
    /// </summary>
    /// <param name="emailAddress"></param>
    /// <returns>bool</returns>
    public static bool IsValidEmailAddressDelimitedList(this string emailAddress, char delimiter = ';')
    {
        var valid = true;
        var isnotblank = false;

        string[] emails = emailAddress.Split(delimiter);

        foreach (string e in emails)
        {
            var email = e.Trim();
            if (email.Length > 0 && valid) // if valid == false, no reason to continue checking
            {
                isnotblank = true;
                if (!email.IsValidEmailAddress())
                {
                    valid = false;
                }
            }
        }
        return (valid && isnotblank);
    }
//
///验证字符串是否为电子邮件地址。。。
/// 
/// 
///布尔
公共静态bool IsValidEmailAddress(此字符串emailAddress)
{
var valid=true;
var isnotblank=false;
var email=emailAddress.Trim();
如果(email.Length>0)
{
//电子邮件地址不能以句点开头。
//名称部分必须至少包含一个字符
//在名称中,有效字符为:a-z 0-9!##&'=`{}~-+*?^|/$
//不能在@sign之前有句点。
//不能有两个@符号
//在域中,有效字符为:a-z 0-9-。
//域不能以句点或破折号开头
//域名必须为2个字符..不超过256个字符
//域不能以句点或破折号结束。
//域必须包含句点
isnotblank=true;
valid=Regex.IsMatch(电子邮件,@“\A([\w!\%&'”=`{}.\-\+\*\?\^\\\\\\\/\$])+@{1}\w+([-.]\w+*\.\w+([-.]\w+*\z),RegexOptions.IgnoreCase)&&
!email.StartsWith(“-”)&&
!email.StartsWith(“.”)&&
!email.EndsWith(“.”)和
!email.Contains(“…”)&&
!email.Contains(“.@”)&&
!email.Contains(“@”);
}
返回值(有效且不为空);
}
/// 
///验证字符串是否为电子邮件地址或电子邮件地址的分隔字符串。。。
/// 
/// 
///布尔
公共静态bool IsValidEmailAddressDelimitedList(此字符串为emailAddress,字符分隔符=';')
{
var valid=true;
var isnotblank=false;
字符串[]emails=emailAddress.Split(分隔符);
foreach(电子邮件中的字符串e)
{
var email=e.Trim();
if(email.Length>0&&valid)//if valid==false,没有理由继续检查
{
isnotblank=true;
如果(!email.IsValidEmailAddress())
{
有效=错误;
}
}
}
返回值(有效且不为空);
}

您可以使用以下正则表达式来允许多封电子邮件以分号分隔,并且(可选)在分号之外加空格。它还将接受不以分号结尾的单个电子邮件地址

现在它也允许空条目(没有电子邮件地址)。如果您想将其更改为至少有1个,则将最后的*by+替换为至少需要一个地址

(([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)(\s*;\s*|\s*$))*
如果要允许逗号和分号,可以更改以下内容:

(\s*;\s*|\s*$)
为此:

(\s*(;|,)\s*|\s*$)

您可以使用:
if(!email.IsValidEmailAddress())简化列表验证return false;
因为在这种情况下,for循环没有意义。最终的返回变成
return isnotblank;
并且
valid
变量可以被删除。是的。我这样做只是为了在那里放一个断点。我经常这样做。要查看电子邮件地址是否有效,请参阅请注意,在该MSDN示例的末尾:“您可以使用System.Net.Mail.MailAddress类,而不是使用正则表达式验证电子邮件地址。要确定电子邮件地址是否有效,请将电子邮件地址传递给MailAddress.MailAddress(String)类构造函数。”这适用于分号删除。但是,电子邮件地址的要求要复杂得多。大约有14个特殊字符与您的正则表达式不匹配。此外,电子邮件不能以句号或破折号开头或结尾。并且@符号不能在前后使用句号。
(\s*(;|,)\s*|\s*$)