Regex pour le courrier électronique

Les Regex (Regular Expression) sont une chose très pratique pour trouver un texte avec un certain modèle dans un autre texte. Mais si l’on a besoin d’une expression Regex pour trouver une adresse électronique dans un texte, cela devient vite compliqué là où il ne faut pas compliquer les choses. Lors de mes recherches sur Internet, je suis tombé sur de très nombreux exemples de patterns regex et de longues discussions sur les forums concernant les différentes expressions regex pour trouver une adresse e-mail. Malheureusement, dans mon cas, peu d’entre elles ont abouti à un match où il aurait dû y avoir une correspondance, si bien que j’ai fini par bricoler mon propre schéma.

Dans mon cas concret, je voulais rédiger un e-mail de réponse automatique à l’aide d’une macro VBA et, pour les e-mails transférés, l’expéditeur d’origine d’un e-mail devait être déterminé à partir du texte de l’e-mail, puis l’e-mail d’origine devait être marqué comme lu et déplacé vers un autre dossier.

Expression régulière pour déterminer l’adresse e-mail

Pour déterminer l’adresse e-mail, j’ai utilisé le code VBA suivant. Mais le code de règles peut bien sûr être utilisé dans n’importe quel autre langage de programmation, comme C#. Le cas échéant, il suffit de tenir compte de quelques spécificités du langage de programmation concerné.

   Dim myRegex As Object
    Dim résultats As objet
    Dim match As Object

    Set myRegex = New RegExp
    myRegex.pattern = "[\w.-]*@[\w.-]*\.[\w]{2,6}"
    myRegex.Global = True.
    Set results = myRegex.Execute(body)

    For Each match In results
        Debug.Print match.Value
        If match.Value = "searched@mail.de" Then
            'fais quelque chose ici
            Exit For
        End If
    Next

L’expression régulière proprement dite se compose donc de :

[\w.-]*@[\w.-]*\.[\w]{2,6}

Pour explication:

On reconnaît clairement le signe @. Il est précédé de l’expression [\w.-]*. \w représente n’importe quelle lettre, un trait de soulignement et n’importe quel chiffre de 0-9. En outre, un point “.” et un trait d’union ont été ajoutés. L’astérisque “*” placé après les crochets indique que les caractères susmentionnés peuvent apparaître en un nombre quelconque. Il est suivi du signe @ et à nouveau de la même expression, qui représente maintenant le nom de domaine. Le nom de domaine peut donc aussi être composé de n’importe quelles lettres, chiffres et aussi de sous-domaines, séparés par un point.
Ensuite vient le point qui délimite le domaine de premier niveau (TLD), donc par exemple .de, .us, .com, .fr, .es. Comme le point lui-même a une signification dans la regex, il représente presque n’importe quel caractère, le point doit être écrit avec une barre oblique inverse “\.”.
Puis vient l’expression proprement dite pour le domaine de premier niveau [\w]{2,6}. Celle-ci indique que le domaine de premier niveau peut être composé de n’importe quel caractère (lettres, chiffres, souligné) et qu’il peut comporter au minimum deux caractères et au maximum six caractères. Cela peut certainement être encore plus précis, car je ne connais pas de TLD contenant des chiffres et, d’autre part, il existe déjà des TLD de plus de six lettres, comme .example ou .hamburg. Mais dans la plupart des cas, l’expression mentionnée ci-dessus fait du bon travail.

Cela permet donc de saisir toutes les adresses de messagerie, comme par exemple

  • erwin@ekiwi-blog.de
  • erwin.mueller@ekiwi.de
  • pergamont@berlin.museum
  • funny_ow.1.outreach@gma1il.ffg.com

Non couverts sont les mails avec des caractères spéciaux ou des TLD très longs. Si cela existe, on peut adapter l’expression regex en conséquence en ajoutant les caractères spéciaux ou en adaptant le nombre maximal de caractères du TLD.

  • jonny.doe+marry-ann@gmail.com
  • John.O’Connor@gmail.ie
  • “Daniel\NO’Miller”@googlemail.com
  • toIPDomain@[1.2.3.4]

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *