正则表达式根据RFC2822验证消息ID

时间:2010-10-19 12:52:18

标签: regex email rfc2822

我还没有找到这样做的正则表达式。我需要验证电子邮件中的“Message-ID:”值。它类似于电子邮件地址验证regexp,但更简单,没有电子邮件地址允许的大多数边缘情况,来自rfc2822

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&lt;&gt;是可选的。可以在rfc2822

中找到点原子文本和缺少的定义

我不熟练使用正则表达式,如果存在,我更喜欢使用已经测试过的正则表达式。

4 个答案:

答案 0 :(得分:4)

如果有兴趣,我们的一位高级架构师会通过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]))*\])))

答案 1 :(得分:3)

因为我找不到任何我自己最终实现它。根据RFC2822,它不是一个合适的验证,但现在已经足够好了:

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();
}

答案 2 :(得分:1)

使用标准正则表达式无法完美匹配RFC2822消息ID,因为CFWS规则允许嵌套注释,正则表达式无法应对。 e.g。

<foo@bar.com> (comment (another comment))

答案 3 :(得分:-3)

尝试像 - &gt; ^ [A-Z0-9 ._%+ - ] + @ [A-Z0-9 .-] + [A-Z] {2,} $