Problème regex pour adresse email

Fermé
momop72 - 6 oct. 2013 à 22:22
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 6 oct. 2013 à 23:18
Bonsoir,

J'ai un problème avec les expressions régulières j'essaie de mettre une contrainte pour accepter certaines adresses email ou non mais en vain.

J'aimerais que mes adresses comportent un @ et un . pour respecter le format suivant : ***@***

En suivant un tutoriel j'en suivi venu à faire ça :
Pattern.matches("*@*.*", email);

Ça parait simple et pourtant ça ne donne rien, en regardant des exemples sur le net j'ai vu des choses inutilement bien plus compliquées et je me suis tenté à faire ça :
Pattern.matches("^*+\\@*+\\.*+$", email)

Ce qui ne donne toujours rien... Quelqu'un pourrait m'expliquer ? Merci.

4 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
6 oct. 2013 à 22:37
"inutilement bien plus compliquées"
Pas tant que ça... et encore on est loin du compte.

En autorisant n'importe quel caractère tu te retrouves rapidement avec des aberrations comme
{µp@ <.#
c'est loin d'être un email et pourtant ça respecte bien le format
***@***.***
il y a donc beaucoup plus de contraintes à imposer.
0
C'est pour un travail scolaire, je veux donc juste une contrainte vérifiant le format ***@***echoseourien

Accessoirement ça me permettra de comprendre.

EDIT : La censure est un peu embêtante mais vous avez compris ce que je voulais.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
6 oct. 2013 à 22:56
L'astérisque est un opérateur de multiplicité qui signifie 0, 1 ou plusieurs fois, mais il doit être précédé de quelque chose, par exemple "n'importe quoi" qui est représenté par le point. Ainsi
.*
veut dire n'importe quoi 0, 1 ou plusieurs fois, perso ici je mettrais plutôt
.+
qui signifie 1 ou plusieurs fois, ce qui oblige à avoir au moins un caractère avant et après l'arobase. Ce qui donne l'expression
.+@.+
exemple :

public static void main(String[] args)
{
String regex = ".+@.+";
System.out.println("toto".matches(regex)); // false
System.out.println("toto@tata".matches(regex)); // true
}

Pour info : c'est la spécification officielle RFC 5322 qui définit le format des adresses mails, une expression régulière tout à fait correcte serait donc :

(?:[a-z0-9!#$%&'*+/=?^_'{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_'{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

Même si en réalité 99.9% des adresses mails utilisées aujourd'hui matchent cette expression régulière simplifiée :

[a-z0-9!#$%&'*+/=?^_'{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_'{|}~-]+)*@
(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
0
Ok je viens de tester et à priori ça marche, j'ai utiliser comme pattern :
".+@.+\\..+"
Qui me permet de tester si un "." est présent après l'"@"

Je te remercie pour tes explications claires et précises.

J'abuse peut être un peu mais tu pourrais me dire comment vérifier qu'une chaîne ne contient que des lettres ? J'ai essayé d'utiliser "\D" mais le compilateur refuse (bon je me doute un peu pourquoi en même temps), j'essaie "\\D" mais ça ne donne pas le résultat escompté...

EDIT : Non c'est bon j'ai trouvé c'est le pattern "[a-zA-Z]+", désolé.
Je te remercie beaucoup pour ton aide en tout cas, je ne sais pas combien de temps j'y aurais passé sans toi.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
6 oct. 2013 à 23:18
Tu trouveras la syntaxe complète dans la documentation de la classe Pattern :
https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

\D c'est "tout sauf un chiffre" donc c'est normal que ça ne te donnes pas ce que tu veux...
0