begin process at 2012 05 27 06:39:48
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > EXPRESSIONS RÉGULIÈRES EN C++ AVEC ATL

EXPRESSIONS RÉGULIÈRES EN C++ AVEC ATL


 Information sur la source

Note :
9 / 10 - par 4 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Classé sous :expressions, régulières, validation, email Niveau :Initié Date de création :11/10/2005 Date de mise à jour :11/10/2005 09:36:18 Vu :13 061

Auteur : poppyto

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note


 Description

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%20e xpressions%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

  • //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;
  • }
//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).


 Historique

11 octobre 2005 09:25:23 :
Corrections orthographiques
11 octobre 2005 09:36:18 :
corrections orthographiques bis

 Sources du même auteur

RECONNAISSANCE DE TYPES D'OBJETS EN C++
Source avec Zip Source avec une capture SHELLTUNNING : VIDÉO À LA PLACE DU FOND D'ÉCRAN
Source avec Zip Source avec une capture CHANGEZ L'APPARENCE DU BUREAU DE WINDOWS ET GAGNEZ DE LA PLA...

 Sources de la même categorie

Source avec Zip WIN32 TLS LENT par dguilmain
Source avec Zip VIDER ELEMENTS DE CORBEILLE WINDOWS7 (WIN64) par BruNews
Source avec Zip Source avec une capture FIND TEXT (WIN64) par BruNews
Source avec Zip DELETE DIRECTORY (WIN64) par BruNews
Source avec Zip ENUM DIRECTORY (WIN64) par BruNews

 Sources en rapport avec celle ci

GENERATEUR D'ADRESSE EMAIL POUR EMAILING par seifmyroot1
Source avec Zip Source avec une capture Source .NET (Dotnet) SCANNER D'ADRESSES MAILS PRÉSENTENT SUR GOOGLE par Zaltez
Source avec Zip Source avec une capture MINI-MAILER V1.4 par Mini92
VALIDATEUR ISBN (10 CHIFFRES) ET ISSN (8 CHIFFRES) par boudreau_benjamin
Source avec Zip Source avec une capture DÉBLOQUER LES PIÈCES JOINTES D'OUTLOOK par Xaviou

Commentaires et avis

Commentaire de MuPuF le 12/10/2005 15:53:10

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 ...) ?

Commentaire de poppyto le 12/10/2005 15:59:14 administrateur CS

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);
}
}

}

Commentaire de MuPuF le 12/10/2005 16:02:06

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 !

Commentaire de poppyto le 12/10/2005 19:01:16 administrateur CS

Pas de problème, il faut partager les trucs utiles ;).

Commentaire de weahgeorges le 19/05/2009 15:34:02

vraiment utile, merci.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

programmation d'un bibliothèque d'expressions régulières [ par kkronos666 ] Bonjour,Pour mon projet de fin d'année, je doit creer une biblitohèque des expressions régulières ( un équivalent de regex.h mais fais à la kkronos666 Algo de création d'une clé de validation [ par hubchau ] Bonjour à tous !Je suis apprenti au département informatique d'une boite qui gère pas mal d'entrées et de sorties de matos info. Mon projet principal mot de passe [ par soniabor ] Salut à tout le monde : je veux présenter mon problème. J'ai une form2 avec un textbox et un bouton de validation, cette form est pour l'inscription excel [ par greg79000 ] Bonjour, J'ai besoin d'aide le plus rapidement possible SVP. Je suis en stage et je bloque mais quelque chose de sévère.Alors voilà, pour de multiples [BAR]Problème d'envoie email avec Ghostmail [ par prediction2009 ] Bonjour, j'ai téléchargé ghostmail 5.1, seulement il marche parfaitement sous free, wanadoo ... Mais pas du tout sur neufbox SFR ... ----------------- Probléme SMTP laposte.net [ par jerem3000 ] Bonjour, J'ai un petit problème pour envoyer des email depuis smtp.laposte.net. le code que j'utilise marche parfaitement sur un SMTP sans authentif validation de données personnalisée [ par youandmy ] comment simplifier cette formule que j'utilise dans la validation d'une cellule? il y a trop de caractères. =OU(E8="E8="ALIMENTAIRE";E8="ELECTRO";E8 validation de données avec formule [ par youandmy ] Bonsoir tout le monde, je cherche la réponse à la question suivante: j'ai créé dans la cellule A1, une validation à base d'une formule qui me permet


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,012 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales