如何验证电子邮件地址输入?

时间:2009-07-01 11:02:03

标签: asp.net regex validation

我有一个ASP.NET网络表单,我可以在其中输入电子邮件地址。

我需要使用以下模式验证具有可接受电子邮件地址的字段:

xxx@home.co.uk
xxx@home.com
xxx@homegroup.com

10 个答案:

答案 0 :(得分:7)

验证这一点的正则表达式是:

^[A-Z0-9._%+-]+((@home\.co\.uk)|(@home\.com)|(@homegroup\.com))$

C#样本:

string emailAddress = "jim@home.com";
string pattern = @"^[A-Z0-9._%+-]+((@home\.co\.uk)|(@home\.com)|(@homegroup\.com))$";
if (Regex.IsMatch(emailAddress, pattern, RegexOptions.IgnoreCase))
{
    // email address is valid
}

VB示例:

Dim emailAddress As String = "jim@home.com"
Dim pattern As String = "^[A-Z0-9._%+-]+((@home\.co\.uk)|(@home\.com)|(@homegroup\.com))$";
If Regex.IsMatch(emailAddress, pattern, RegexOptions.IgnoreCase) Then
    ' email address is valid
End If

答案 1 :(得分:6)

以下是我使用System.Net.Mail.MailAddress进行验证的方法:

bool valid = true;
try
{
    MailAddress address = new MailAddress(email);
}
catch(FormatException)
{
    valid = false;
}

if(!(email.EndsWith("@home.co.uk") || 
     email.EndsWith("@home.com") || 
     email.EndsWith("@homegroup.com")))
{
    valid = false;
}

return valid;

MailAddress首先验证它是有效的电子邮件地址。然后其余的验证它以您需要的目的地结束。对我来说,这比每个看起来笨拙的正则表达式更容易理解。它可能不像正则表达式那样高效,但听起来并不像是在循环中验证它们中的一堆......在网页上一次只有一个

答案 2 :(得分:4)

根据您使用的ASP.NET版本,您可以在“验证”下的工具箱中使用其中一个表单验证控件。这可能比回发后设置自己的逻辑更可取。有几种类型可以拖动到表单并与控件关联,您也可以自定义错误消息和定位。

有几种类型可以使它成为必需字段或确保它在一定范围内,但您可能需要正则表达式验证器。您可以使用已经显示的表达式之一,或者我认为Visual Studio可能会提供一个示例电子邮件地址。

答案 3 :(得分:2)

答案 4 :(得分:1)

我第二次使用正则表达式,但帕特里克的正则表达式不起作用(错误的交替)。尝试:

[A-Z0-9._%+-]+@home(\.co\.uk|(group)?\.com)

并且不要忘记在源代码中使用的字符串中转义反斜杠,具体取决于所使用的语言。

"[A-Z0-9._%+-]+@home(\\.co\\.uk|(group)?\\.com)"

答案 5 :(得分:1)

以下是来自 RFC 2822 的官方正则表达式,它将匹配任何正确的电子邮件地址:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

答案 6 :(得分:0)

试试这个:

Regex matcher = new Regex(@"([a-zA-Z0-9_\-\.]+)\@((home\.co\.uk)|(home\.com)|(homegroup\.com))");

if(matcher.IsMatch(theEmailAddressToCheck))
{
    //Allow it
}
else
{
    //Don't allow it
}

您还需要将Regex名称空间添加到您的类中:

using System.Text.RegularExpressions;

答案 7 :(得分:0)

执行此操作的扩展方法是:

public static bool ValidEmail(this string email)
    {
        var emailregex = new Regex(@"[A-Za-z0-9._%-]+(@home\.co\.uk$)|(@home\.com$)|(@homegroup\.com$)");
        var match = emailregex.Match(email);
        return match.Success;
    }

答案 8 :(得分:0)

在ValidateExpression属性中使用带有正则表达式的<asp:RegularExpressionValidator ../>

答案 9 :(得分:-1)

帕特里克斯的回答看起来很好,但有一些缺陷。

  • 您确实希望对正则表达式的各个部分进行分组,但不想捕获它们。因此,您需要使用非捕获括号。
  • 交替出现部分错误。
  • 它不会测试这是字符串的一部分还是整个字符串
  • 它使用Regex.Match代替Regex.IsMatch

C#中更好的解决方案是:

string emailAddress = "someone@home.co.uk";
if (Regex.IsMatch(emailAddress, @"^[A-Z0-9._%+-]+@home(?:\.co\.uk|(?:group)?\.com)$", RegexOptions.IgnoreCase))
{
    // email address is valid
}

当然,要确保所有电子邮件地址都通过,您可以使用更全面的表达方式:

string emailAddress = "someone@home.co.uk";
if (Regex.IsMatch(emailAddress, @"^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@home(?:\.co\.uk|(?:group)?\.com)$", RegexOptions.IgnoreCase))
{
    // email address is valid
}