Expressions régulières en c++ avec atl

Contenu du snippet

Tout d'abord pour ceux qui ne savent pas ce que sont les expressions régulières, jettez un coup d'oeil ici [ http://www.labo-dotnet.com/articles/Csharp/Les%20expressions%20r%C3%A9guli%C3%A8res%20en%20csharp/0/45.aspx ]. Pour ceux qui ont la flemme, en gros ça permet de vérifier le formatage d'une chaîne de caractère. Exemple typique, si on veut vérifier qu'une adresse e-mail est valide (pseudo@domaine), on n'est pas obligé d'écrire un algorythme, il suffit de décrire le format de l'email en expression régulière, et de le comparer à la chaîne.
Personnellement, les expressions régulières m'ont beaucoup manqués en C++ (sans MFC) jusqu'à ce que je trouve une solution honnête sans télécharger des codes open-sources...et la solution est dans COM, ou plutôt ATL. Bref, Microsoft met à disposition un objet robuste qui fait tout. Je présenterais ici l'exemple typique du valideur d'adresse email, mais sachez que tout ce que vous connaissez sur les expressions régulières est possible (le regroupage par exemple).

Source / Exemple :


//Includes obligatoires pour ATL
#include <atlbase.h>
#include <atlrx.h>

//Librairies à ajouter au linker
#pragma comment(lib,"ole32.lib")
#pragma comment(lib,"oleaut32.lib")

///////////////////////////////////////////////////
//
// Fonction : IsMailValide
//
// subject : Vérifie qu'une adresse mail est valide
//           et renvoi TRUE dans ce cas
//
///////////////////////////////////////////////////
BOOL IsMailValide(const char * strAdresseMail)
{
   BOOL Result = FALSE; //Sortie par défaut

   //Instanciation de l'objet constructeur d'expressions régulières
   CAtlRegExp <> regExp;
   
   //Construit l'expression régulière
   //Ici il s'agit de vérifier une adresse mail
   REParseError hParseError = regExp.Parse(
        "\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*" );
    
   //si l'expression est valide
   if (hParseError == REPARSE_ERROR_OK)
   {
                //Instanciation de l'objet comparateur d'expressions régulières
		CAtlREMatchContext <> matchMail;

		//on compare l'expression réguilère à un mail
		if(regExp.Match(strAdresseMail,&matchMail))
			Result = TRUE;
   }

   return Result;
}

Conclusion :


Pour utiliser ce bout de code, rien de plus simple :

BOOL isMailValide = IsMailValide("poppyto@cppfrance.com")

et une fausse :

BOOL isMailValide = IsMailValide("poppyto@ cppfrance.com")

Comme je le disais un peu plus haut, de nombreuses options sont disponibles à travers l'objet CAtlREMatchContext (comme le regroupage).

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.