2010-10-19 29 views
3

我還沒有找到正則表達式來執行此操作。我需要驗證電子郵件中的「Message-ID:」值。它類似於一個電子郵件地址驗證的正則表達式,但更簡單,不需大部分的邊緣情況的電子郵件地址允許,從rfc2822正則表達式根據RFC2822驗證消息ID

msg-id   =  [CFWS] "<" id-left "@" id-right ">" [CFWS] 
id-left   =  dot-atom-text/no-fold-quote/obs-id-left 
id-right  =  dot-atom-text/no-fold-literal/obs-id-right 
no-fold-quote =  DQUOTE *(qtext/quoted-pair) DQUOTE 
no-fold-literal =  "[" *(dtext/quoted-pair) "]" 

比方說,outter <>是可選的。點原子文本和丟失的定義可以在rfc2822

我不精通正則表達式,我更喜歡使用已經測試過的,如果存在。

+1

Found?那麼,試圖自己寫一個呢? :) – bzlm 2010-10-19 12:55:55

回答

3

正如我。找不到任何我最終自己實現它。這不是一個適當的驗證按照RFC2822而是一個足夠好的aproximation現在:

static String VALIDMIDPATTERN = "[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*"; 
private static Pattern patvalidmid = Pattern.compile(VALIDMIDPATTERN); 

public static boolean isMessageIdValid(String midt) { 
    String mid = midt; 
    if (StringUtils.countMatches(mid, "<") > 1) 
     return false; 
    if (StringUtils.countMatches(mid, ">") > 1) 
     return false; 
    if (StringUtils.containsAny(mid, "<>")) { 
     mid = StringUtils.substringBetween(mid, "<", ">"); 
     if (StringUtils.isBlank(mid)) { 
      return false; 
     } 
    } 
    if (StringUtils.contains(mid, "..")) { 
     return false; 
    } 
    //extract from <> 
    mid = mid.trim(); 
    //now validate 
    Matcher m = patvalidmid.matcher(mid); 
    return m.matches(); 
} 
+0

這個正則表達式只覆蓋'id-原子文本'部分'左'和'ID右'?我認爲'obs-id-left'幾乎允許任何ASCII字符。 – Nathan 2013-07-12 02:25:16

+0

@Nathan:很久以前......不記得了。也許你是對的,但我可以告訴你這個impl。已被用於成功處理商業產品中的數百萬個消息ID。所以它可能是安全的使用。 – Persimmonium 2013-07-12 07:02:58

+0

感謝您對生產使用的確認 - 這有助於確認id-left和id-right的引用和過時部分在實際中並未實際使用。 – Nathan 2013-07-14 23:04:40

-2

嘗試財產以後像 - >^[A-Z0-9 ._%+ - ] + @ [A-Z0-9 .-] + [AZ] {2,} $

+0

這是不正確的,它不完全像一個電子郵件地址,@後的部分不需要是'something.something' – Persimmonium 2010-10-19 14:49:05

0

這是不可能使用標準正則表達式,因爲CFWS規則允許嵌套註釋完美匹配RFC2822消息ID,其中正則表達式無法應付。例如

<[email protected]> (comment (another comment)) 
2

如果任何人的興趣,我們的高級建築師之一,通過RFC 2822的多層次合作,並與下面的正則表達式其中包括在左側和右側引用了上來。規範說新的實現不應該使用過時的字符,所以這個正則表達式不允許它們:

((([a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*)|("(([\x01-\x08\x0B\x0C\x0E-\x1F\x7F]|[\x21\x23-\x5B\x5D-\x7E])|(\\[\x01-\x09\x0B\x0C\x0E-\x7F]))*"))@(([a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*)|(\[(([\x01-\x08\x0B\x0C\x0E-\x1F\x7F]|[\x21-\x5A\x5E-\x7E])|(\\[\x01-\x09\x0B\x0C\x0E-\x7F]))*\])))