【问题标题】:Regex Email with 2 characters after @ [duplicate]@后有2个字符的正则表达式电子邮件[重复]
【发布时间】:2013-11-20 12:32:20
【问题描述】:

我正在使用 ASP.NET MVC 3 C#,我有这个正则表达式:

@"([a-zA-Z0-9%._-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,4})+"

它几乎适用于所有情况,除非 @ 后面的字符少于 2 个。

例如: stackoverflow@ab.com stackoverflow@a.com

我在论坛上没有找到类似的东西,而且我对正则表达式几乎一无所知。 有人可以帮忙吗?谢谢。 (抱歉英语不好)。

【问题讨论】:

标签: c# regex asp.net-mvc validation data-annotations


【解决方案1】:

您没有转义 RegExp 中的句点 (.),因此它们基本上是 ANY CHARACTER 占位符。

电子邮件地址的域部分(@ 之后)只能包含字母、数字、句点和连字符。第一个和最后一个字符以及句点前后的字符必须是字母或数字。 这可能会因为新的允许外来字符而改变。

【讨论】:

  • 如果你仍然问为什么 x@a.com 失败,解释如下...... Regex 匹配地址的最后 4 个字符(即“.com”),因为模式末尾的范围为 2-4 个字符,而模式中的最后一个点与“a”匹配,这不会为“+”模式留下任何内容,并且它至少需要一个字符,因此该模式无法匹配。
【解决方案2】:

http://www.regular-expressions.info/email.html

RFC 5322:

(?:[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])+)
     \])

【讨论】:

    【解决方案3】:

    由于这是 C#,您始终可以创建自己的属性以使其看起来更具吸引力。

    using System.ComponentModel.DataAnnotations;
    class EmailValidationAttribute : RegularExpressionAttribute
    {
        public EmailValidationAttribute()
            : base("^[a-zA-Z0-9_\\+-]+(\\.[a-zA-Z0-9_\\+-]+)*@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.([a-zA-Z]{2,4})$") { }
    }
    
    
    class EmailTest
    {
        [EmailValidation(ErrorMessage="Please Enter a valid email address")]
        public String Email { get; set; }
    
    }
    

    这应该考虑到大多数情况,您始终可以将它与 Robert P 的答案结合起来以获得更好的正则表达式,但据我所知,它并没有考虑到人们用大写字母写电子邮件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-03
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多