web-dev-qa-db-fra.com

Meilleure expression régulière pour la validation de courrier électronique en C #

J'ai vu une multitude d'expressions régulières pour différents langages de programmation censées valider des adresses électroniques. J'ai entendu de nombreux commentaires affirmer que les expressions en question ne fonctionnaient pas dans certains cas et qu'elles étaient trop strictes ou trop permissives. Ce que je recherche, c’est une expression régulière que je peux utiliser dans mon code C # qui est définitif.

La meilleure chose que j'ai trouvée est celle-ci

^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$

Y a-t-il quelque chose de mieux?

28
Sachin Kainth

Adresse e-mail: Format RFC 2822 
Correspond à une adresse email normale. Ne vérifie pas le domaine de premier niveau.
Requiert le "cas insensible à la casse" option pour être sur.

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

Utilisation: 

bool isEmail = Regex.IsMatch(emailString, @"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z", RegexOptions.IgnoreCase);
128
PaRiMaL RaJ

Première option (mauvais à cause du lancer, mais MS travaillera pour vous):

bool IsValidEmail(string email)
{
    try {
        var mail = new System.Net.Mail.MailAddress(email);
        return true;
    }
    catch {
        return false;
    }
}

La deuxième option est lue Je savais comment valider une adresse électronique avant de lire les spécifications RFC et RFC

20
Piotr Stapp

Cette fonction C # utilise une expression régulière pour évaluer si l'adresse électronique transmise est syntaxiquement valide ou non.

public static bool isValidEmail(string inputEmail)
{
   string strRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
         @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" + 
         @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
   Regex re = new Regex(strRegex);
   if (re.IsMatch(inputEmail))
    return (true);
   else
    return (false);
}
12
Obama

Réponse mise à jour pour 2019.

L'objet Regex est thread-safe pour les fonctions correspondantes. Sachant cela et certaines options de performances ou problèmes culturels/linguistiques, je propose cette solution simple.

public static Regex _regex = new Regex(
    @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$",
    RegexOptions.CultureInvariant | RegexOptions.Singleline);

public static bool IsValidEmailFormat(string emailInput)
{
    return _regex.IsMatch(emailInput);
}

Configuration alternative pour Regex:

public static Regex _regex = new Regex(
    @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$",
    RegexOptions.CultureInvariant | RegexOptions.Compiled);

Je trouve que la compilation est plus rapide que sur des correspondances de grandes chaînes, comme l'analyse de livre par exemple. La correspondance de courrier électronique simple est plus rapide en laissant simplement Regex interpréter.

Sécurité des fils et regex
Meilleures pratiques Regex

0
HouseCat

Regex de validation d'email

^ [a-z0-9] [- a-z0-9 ._] + @ ([- a-z0-9] +.) + [a-z] {2,5} $

Ou

^ [a-z0-9] [- a-z0-9 ._] + @ ([- a-z0-9] + [.]) + [a-z] {2,5} $

Lien de démonstration:

https://regex101.com/r/kN4nJ0/53

0
user9594969