Problème regex pour adresse email

momop72 -  
KX Messages postés 19031 Statut Modérateur -
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

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    "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
  2. momop72
     
    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
  3. KX Messages postés 19031 Statut Modérateur 3 020
     
    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
  4. momop72
     
    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