【问题标题】:How to validate email address inputs?如何验证电子邮件地址输入?
【发布时间】:2009-07-01 11:02:02
【问题描述】:

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

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

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

【问题讨论】:

  • 这是人们指出的正则表达式的经典用法之一,很难正确处理。有这么多答案指出其他人的答案中的错误,这一简单事实足以证明这一点。这就是我尽量避免使用正则表达式的原因,比如电子邮件地址、URL 等。使用库。
  • 然而,在这种情况下,仅使用库意味着在回发之后进行验证,而不是在表单上进行验证。有些代码很难写,但仍然值得写。

标签: asp.net regex validation


【解决方案1】:

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

^[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

【讨论】:

  • 伙计们,你们的表达都不起作用;我通过将您的表达式作为正则表达式验证器属性值来检查它。控制未验证。请再次查看我的问题;任何地方都没有基地......我想知道基地是如何得到答案的:-o
  • @Jaison:你说得对,它一定是介于两者之间。但话又说回来,它很容易修复。 s/base/group/ ;-)
  • @Jaison,似乎错误开始于我的回答,其他人都复制了我的错误,基本的男生错误哈哈,但这并不需要天才来解决
  • 如果您使用 ASP.NET 正则表达式验证器对象,则需要包含 [a-z][A-Z],因为它是特定于大小写的。
【解决方案2】:

以下是我将如何使用 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 首先验证它是一个有效的电子邮件地址。然后其余的验证它以您需要的目的地结束。对我来说,这对于每个人来说都比一些看起来笨拙的正则表达式更容易理解。它可能不如正则表达式的性能好,但听起来不像是在循环中验证一堆......在网页上一次只验证一个

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 另外+1,建议使用验证控件的好答案,特别是指出正则表达式验证器控件。
    • 为了清楚起见,您不应将后端验证替换为客户端验证。您绝对应该同时使用它们,或仅在服务器端使用,但绝不应仅在客户端使用。验证控件非常好,但不能替代真正的服务器端验证。
    【解决方案4】:

    【讨论】:

      【解决方案5】:

      这是来自 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])+)\])
      

      【讨论】:

      • 伙计们,你们的表达都不起作用;我通过将您的表达式作为正则表达式验证器属性值来检查它。控制未验证。请再次查看我的问题;任何地方都没有homebase ..我想知道homebase是如何得到答案的:-o当我给cdfsdf@home1.com它正在验证..它不应该验证
      【解决方案6】:

      我支持使用正则表达式,但是帕特里克的正则表达式不起作用(错误的交替)。试试:

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

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

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

      【讨论】:

      • 伙计们,你们的表达都不起作用;我通过将您的表达式作为正则表达式验证器属性值来检查它。控制未验证。请再次查看我的问题;任何地方都没有基地......我想知道基地是如何得到答案的:-o
      【解决方案7】:

      试试这个:

      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;
      

      【讨论】:

      • 小心你的点,你的表情会匹配任何人@homexco,例如英国
      • 是的,你是对的 - 你能解释一下你的反斜杠做什么来解决这个问题吗?谢谢。
      • 啊我现在明白了 - 任何字符都可以是点,但是 \. = 文字。很酷,谢谢!
      【解决方案8】:

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

      【讨论】:

      • 我知道这是一个 10 年前的答案,但是这家伙需要知道 what 正则表达式才能写;他已经知道他需要使用正则表达式验证。
      【解决方案9】:

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

      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;
          }
      

      【讨论】:

      • 伙计们,你们的表达都不起作用;我通过将您的表达式作为正则表达式验证器属性值来检查它。控制未验证。请再次查看我的问题;任何地方都没有基地......我想知道基地是如何得到答案的:-o
      • "homebase" 在我的代码中的任何地方都没有提到。我进行了一些测试,发现它们通过了,除非使用像“test@homegroup.common”这样的电子邮件地址。这在它应该失败的时候通过了。为了解决这个问题,我添加了 $ 以将表达式匹配到行尾。
      【解决方案10】:

      Patricks 的回答似乎做得很好,但有一些缺陷。

      • 您确实想对正则表达式的某些部分进行分组,但又不想捕获它们。因此,您需要使用非捕获括号。
      • 交替出现部分错误。
      • 它不会测试这是字符串的一部分还是整个字符串
      • 它使用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
      }
      

      【讨论】:

      • 大声笑...很好...这将教我正确阅读问题:)
      • 嗨,Huppie,你能告诉我我的替换部分是否还有问题吗?我已经更新了我的答案,你还有更多的 cmets 吗?
      • 你们看到我的问题中的基地了吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      • 2011-09-02
      • 2013-02-20
      相关资源
      最近更新 更多