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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 15 842 fois - Téléchargée 28 fois

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

Ajouter un commentaire

Commentaires

Messages postés
17
Date d'inscription
mercredi 6 mai 2009
Statut
Membre
Dernière intervention
6 juillet 2009

vraiment utile, merci.
Messages postés
540
Date d'inscription
dimanche 29 décembre 2002
Statut
Modérateur
Dernière intervention
13 mai 2011

Pas de problème, il faut partager les trucs utiles ;).
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008

encore plus intéréssant, je sens que je vais plus avoir de fonction de parsage d'argument bientot, celle la ferra parfaitement l'affaire :-D
Merci pour cette source !
Messages postés
540
Date d'inscription
dimanche 29 décembre 2002
Statut
Modérateur
Dernière intervention
13 mai 2011

Je laisse les pros des expressions régulières t'aiguiller sur la bonne syntaxe ^^ mais en tout cas ça peut faire exactement ce que tu demandes.

Voilà un exemple avec une URL :

CAtlRegExp<> reUrl;

REParseError status = reUrl.Parse(
"({[^:/?#]+}:)?(//{[^/?#]*})?{[^?#]*}(?{[^#]*})?(#{.*})?" );
if (REPARSE_ERROR_OK == status)
{

CAtlREMatchContext<> mcUrl;
if(reUrl.Match(
"http://search.microsoft.com/us/Search.asp?qu=atl&boolean=ALL#results",
&mcUrl))
{
for (UINT nGroupIndex = 0; nGroupIndex < mcUrl.m_uNumGroups;
++nGroupIndex)
{
const CAtlREMatchContext<>::RECHAR* szStart = 0;
const CAtlREMatchContext<>::RECHAR* szEnd = 0;
mcUrl.GetMatch(nGroupIndex, &szStart, &szEnd);

ptrdiff_t nLength = szEnd - szStart;
printf("%d: "%.*s"\n", nGroupIndex, nLength, szStart);
}
}

}
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008

tres tres tres intéréssant, ça peut aussi permettre de parser une chaine de caractere ?
(exemple lien://IP|Taille|Nom|)
Un peu comme l'inverse de sprintf( y'a bien une commande qui fais ça mais tellement mal que bon ...) ?

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.