2011-06-23 21 views
2

ただ一つのことを明確にしたい。クライアントごとに、電子メールアドレスにアポストロフィを許可するように正規表現を作成する必要があります。C#電子メールアドレスの有効性確認

私の質問によると、RFCの標準は、メールアドレスにはaportropheが含まれますか?もしそうなら再現する方法正規表現を許可するアポストロフィ

+0

アポストロフィを許可していない正規表現はありますか? – JeremyWeir

+0

このリンクはあなたを助けます。 http://stackoverflow.com/questions/1903356/email-validation-regular-expression/1903368#1903368 – hashi

答えて

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])+)\]) 

あなたは単純化されたものを使用することができます

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

そして、はい、アポストロフィがあれば、ドメイン名ではないとして、電子メールで許可されています。

+0

RFC 2822はRFC 5322(ドラフト標準)に置き換えられています。 –

3

ここに、私が書いた検証属性があります。これは、ほとんどすべての "raw"電子メールアドレス、つまりローカル部分 @ * domain *の形式のものを検証します。これは、(このリストは、任意の手段によって包括的ではありません)RFCができるように、他の、より多くの...創造的な構文のいずれかをサポートしていません:

  • コメント(例えば、[email protected] (work)
  • 引用符で囲まれた文字列を(エスケープアトムに許可されていない文字を可能にするために、テキスト、)
  • ドメインリテラル(例えば[email protected][123.45.67.012]
  • ソースルーティング別名バン・パス()W折りたたみ
  • 角アドレス(例えばJohn Smith <[email protected]>
  • hitespace
  • ローカル部分またはドメイン(7ビットASCIIのみ)のいずれかの2バイト文字。

それはほとんど引用符(")の使用を必要とせずにthusly

発現させることができる任意の電子メールアドレス、アングルブラケット(受け入れるべき< ')または角かっこ([])です。

ドメインの右端のdnsラベルが有効なTLD(トップレベルドメイン)であることを検証する試みは行われません。これは、TLDのリストが "big 6"(.com、.edu、.gov、.mil、.net、.org)と2文字のISO国コードをはるかに超えているためです。 ICANN actually updates the TLD list dailyですが、リストは実際に毎日変更されるとは限りません。さらに、ICANN just approved a big expansion of the generic TLD namespace)。また、一部のメールアドレスにはTLDとして認識されていないものがあります([email protected]は理論上有効で利用可能であることをご存知ですか?そのアドレスへのメールを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 ; 
    } 

    } 
} 

乾杯!

+0

これが正しいかどうかはわかりませんが、実際にあなたの仕事を見せて、正規表現がどのように構成されているかを示しています(電子メールアドレスのCFGから?)。 –

関連する問題