8
votes

Regex pour valider un message-ID selon RFC2822

Je n'ai pas trouvé de regexp pour le faire. Je dois valider la valeur "Message-ID:" d'un email. Il est similaire à une validation d'adresse e-mail non plus simple, mais beaucoup plus simple, sans la plupart des cas de bord, l'adresse e-mail permet, de 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) "]"


1 commentaires

Trouvé? Eh bien, que diriez-vous d'essayer d'écrire un vous-même? :)


4 Réponses :


-3
votes

Essayez quelque chose comme -> ^ [A-Z0-9 ._% + -] + @ [A-Z0-9 .-] +. [A-Z] {2,} $


1 commentaires

Ce n'est pas correct, ce n'est pas exactement comme une adresse e-mail, la pièce après @ n'a pas besoin d'être "quelque chose" "



3
votes

Comme je ne pouvais trouver aucun je fini par la mettre en œuvre moi-même. Ce n'est pas une validation appropriée selon RFC2822, mais une bonne aprooximation suffisante pour l'instant:

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


3 commentaires

Cette regex couvre-t-elle seulement la partie partie partie de id-gauche et id-droite ? Je pense que obs-id-gauche permettrait de pratiquement n'importe quel caractère ASCII.


@Nathan: Il y a si longtemps ... ne vous en souvenez plus. Vous avez probablement raison, mais je peux vous dire que cela implique. a été utilisé pour traiter plusieurs millions d'identifiants de message dans un produit commercial avec succès. Donc, c'est probablement en sécurité à utiliser.


Merci pour la confirmation de votre utilisation de la production - qui aide à confirmer que les parties de la citation et des obsolètes de l'ID-Gauche et de l'ID-droit ne sont pas réellement utilisées dans la pratique.



0
votes

Il n'est pas possible d'associer parfaitement un identifiant de messagerie RFC2822 à l'aide d'expressions régulières standard, car la règle CFWS permet la nidification des commentaires, qui ne peuvent pas faire face à la nicheur. E.G.

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


1 commentaires

Pas vrai. Des motifs imbriqués peuvent être assortis avec une regex récursive.



7
votes

Si quelqu'un est intéressé, l'un de nos architectes seniors a traversé les nombreuses couches de RFC 2822 et a proposé la regex suivante qui inclut la citation sur les côtés gauche et droit. La spécification indique que de nouvelles implémentations ne doivent pas utiliser les caractères obsolètes. Cette regex ne leur permet pas:

((([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 commentaires

Et voici qu'en tant que chaîne de regex de python, avec des groupes non correspondants: r '(((?: (A-ZA-Z0-9! # $% & \' * + / =? ^ _ `{|} ~ -] + (?: \. [A-ZA-Z0-9! # $% & \ '* + / =? ^ _ {|} ~ -] +) *) | (?:: "(?: (?: [\ x01- \ x 08 \ x0b \ x0c \ x0e- \ x1f \ x7f] | [\ x21 \ x23- \ x5b \ x5d- \ x7e] ) | (?: \\ [\ x0 1- \ 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]) * \])))) '