C#电子邮件地址验证

只是我想澄清一件事。 根据客户端请求,我们必须创建一个正则表达式,以便在电子邮件地址中允许使用撇号。

根据RFC标准,我的问题是电子邮件地址是否包含一个端口? 如果是的话如何重新创建正则表达式以允许撇号


下面的正则表达式实现了电子邮件地址的官方RFC 2822标准。 不推荐在实际应用中使用这个正则表达式。 它表明,通过正则表达式,确切和实际之间总是有一个折衷。

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[x01-x08x0bx0cx0e-x1fx21x23-x5bx5d-x7f]|[x01-x09x0bx0cx0e-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-x08x0bx0cx0e-x1fx21-x5ax53-x7f]|[x01-x09x0bx0cx0e-x7f])+)])

你可以使用简化的:

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

是的,只要不在域名中,电子邮件中允许使用撇号。


这是我写的验证属性。 它几乎验证了每个“原始”电子邮件地址,即那些形式为local-part @ * domain *的地址。 它不支持任何其他的,更多... RFC的允许的创造性构造(这个列表不是全面的):

  • 评论(例如, jsmith@whizbang.com (work)
  • 引用的字符串(转义文本,允许在原子中不允许的字符)
  • 域文字(例如foo@[123.45.67.012]
  • bang-paths(又名源路由)
  • 角度地址(例如John Smith <jsmith@whizbang.com>
  • 折叠空白
  • 本地部分或域中的双字节字符(仅限7位ASCII)。
  • 等等
  • 它应该接受几乎所有可以表达的电子邮件地址

  • foo.bar@bazbat.com
  • 而不需要使用引号( " ),尖括号('<>')或方括号( [] )。

    没有尝试验证域中最右边的dns标签是有效的顶级域名(顶级域名)。 这是因为TLD名单现在比“big 6”(.com,.edu,.gov,.mil,.net,.org)加上两个字母的ISO国家代码要大得多。 ICANN实际上每天更新TLD列表,但我怀疑这个列表实际上并没有每天更改。 此外,ICANN刚刚批准了通用顶级域名(TLD)名称空间的大规模扩展)。 有些电子邮件地址没有你认为的TLD(你知道postmaster@.在理论上是有效和可邮寄的吗?通过邮件发送到DNS根区的邮件主管。)

    扩展正则表达式以支持域文字,它不应该太难。

    干得好。 健康地使用它:

    using System;
    using System.ComponentModel.DataAnnotations;
    using System.Text.RegularExpressions;
    
    namespace ValidationHelpers
    {
      [AttributeUsage( AttributeTargets.Property | AttributeTargets.Field , AllowMultiple = false )]
      sealed public class EmailAddressValidationAttribute : ValidationAttribute
      {
        static EmailAddressValidationAttribute()
        {
          RxEmailAddress = CreateEmailAddressRegex();
          return;
        }
    
        private static Regex CreateEmailAddressRegex()
        {
          // references: RFC 5321, RFC 5322, RFC 1035, plus errata.
          string atom             = @"([A-Z0-9!#$%&'*+-/=?^_`{|}~]+)"                 ;
          string dot              = @"(.)"                                            ;
          string dotAtom          =  "(" + atom + "(" + dot + atom + ")*" + ")"        ;
          string dnsLabel         = "([A-Z]([A-Z0-9-]{0,61}[A-Z0-9])?)"                ;
          string fqdn             = "(" + dnsLabel + "(" + dot + dnsLabel + ")*" + ")" ;
    
          string localPart        = "(?<localpart>" + dotAtom + ")"      ;
          string domain           = "(?<domain>" + fqdn + ")"            ;
          string emailAddrPattern = "^" + localPart + "@" + domain + "$" ;
    
          Regex instance = new Regex( emailAddrPattern , RegexOptions.Singleline | RegexOptions.IgnoreCase );
          return instance;
        }
    
        private static Regex RxEmailAddress;
    
        public override bool IsValid( object value )
        {
          string s      = Convert.ToString( value ) ;
          bool   fValid = string.IsNullOrEmpty( s ) ;
    
          // we'll take an empty field as valid and leave it to the [Required] attribute to enforce that it's been supplied.
          if ( !fValid )
          {
            Match m = RxEmailAddress.Match( s ) ;
    
            if ( m.Success )
            {
              string emailAddr              = m.Value ;
              string localPart              = m.Groups[ "localpart" ].Value ;
              string domain                 = m.Groups[ "domain"    ].Value ;
              bool   fLocalPartLengthValid  = localPart.Length >= 1 && localPart.Length <=  64 ;
              bool   fDomainLengthValid     = domain.Length    >= 1 && domain.Length    <= 255 ;
              bool   fEmailAddrLengthValid  = emailAddr.Length >= 1 && emailAddr.Length <= 256 ; // might be 254 in practice -- the RFCs are a little fuzzy here.
    
              fValid = fLocalPartLengthValid && fDomainLengthValid && fEmailAddrLengthValid ;
    
            }
          }
    
          return fValid ;
        }
    
      }
    }
    

    干杯!

    链接地址: http://www.djcxy.com/p/16579.html

    上一篇: C# Email Address validation

    下一篇: Extract email adresses from text using RegEx c#