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) "]"
4 Réponses :
Essayez quelque chose comme -> ^ [A-Z0-9 ._% + -] + @ [A-Z0-9 .-] +. [A-Z] {2,} $ P>
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" "
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();
}
Cette regex couvre-t-elle seulement la partie code> partie code> partie de id-gauche code> et id-droite code>? Je pense que obs-id-gauche code> 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.
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))
Pas vrai. Des motifs imbriqués peuvent être assortis avec une regex récursive.
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]))*\])))
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]) * \])))) ' code>
Trouvé? Eh bien, que diriez-vous d'essayer d'écrire un vous-même? :)