2011-06-23 244 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

這是我寫的驗證屬性。它幾乎驗證每個「原始」電子郵件地址,即本地部分 @ * domain *。它不支持任何其他的,更...創造性構建了RFC中允許的(這個列表是不全面的,任何方式):

  • 評論(例如,[email protected] (work)
  • 引號的字符串(逃脫文本,以允許字符中的原子不允許)
  • 域文字(例如[email protected][123.45.67.012]
  • 砰路徑(又名源路由)
  • 角地址(例如John Smith <[email protected]>
  • 摺疊瓦特hitespace
  • 本地部分(僅限7位ASCII)中的雙字節字符。

應該接受幾乎可正是如此表示

,而不需要使用引號(")的任何電子郵件地址,尖括號(」 ')或方括號([])。

未嘗試驗證中最右邊的dns標籤是有效的TLD(頂級域)。這是因爲TLD名單現在比「big 6」(.com,.edu,.gov,.mil,.net,.org)加上兩個字母的ISO國家代碼要大得多。 ICANN actually updates the TLD list daily,儘管我懷疑這份名單實際上並沒有每天改變。此外,ICANN just approved a big expansion of the generic TLD namespace)。有些電子郵件地址沒有您認爲的頂級域名(您是否知道[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的電子郵件地址?)。 –