8

これを行うための正規表現が見つかりませんでした。メールの「Message-ID:」の値を検証する必要があります。これは電子メール アドレス検証正規表現に似ていますが、 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) "]"

外側の <> はオプションだとしましょう。dot-atom-text と不足している定義はrfc2822にあります

私は正規表現に堪能ではなく、既にテスト済みのものを使用することを好みます。

4

4 に答える 4

7

興味のある方は、シニア アーキテクトの 1 人が 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]))*\])))
于 2013-07-14T23:07:31.640 に答える
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();
}
于 2010-10-27T09:29:53.047 に答える
0

標準の正規表現を使用して RFC2822 メッセージ ID を完全に一致させることはできません。これは、CFWS 規則では、正規表現では対応できないコメントのネストが許可されているためです。例えば

<foo@bar.com> (comment (another comment))
于 2012-02-20T18:19:57.723 に答える
-3

--> ^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[AZ]{2,}$ のようなものを試してください

于 2010-10-19T13:04:22.680 に答える