Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

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


Information sur la source

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 : 9 520

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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%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

  • //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

Commentaires et avis

signaler à un administrateur
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 ...) ?

signaler à un administrateur
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);
}
}

}

signaler à un administrateur
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 !

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

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

signaler à un administrateur
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 EMAIL [ par marssen ] Salut j'aimerai savoir si il y a quelqu'un qui sait comment on fait pour obtenir de nombreux email gratuit(sites ou autre). Validation d'informations [ par olivierb ] Bonjour,j'essaie de valider les informations d'un programme sous C++Builder.Le problème c'est que j'utilise ce test if(StrToInt(Edit1-&gt;Text) &lt; 2 envoye D'email grace à une MFC [ par Gugaut ] Bonjour à tous,je souhaite faire une MFC capable d'envoyer des Email, je ne sais pas du tout comment faire. je suis debutant, qq 1 peut m'aidermerciGu expressions reguliere [ par Galagan ] Comment faire pur utiliser les expressions reguliere (reg exp) ou le parsing en C++ ? Expression régulières en C [ par CoreBreaker ] Bonjour !Quelqu'un aurrait-il un source pour traiter les expressions régulières de type UNIX en C (reconnaissance + remplacement de motif avec les par cin et validation [ par GPhoenix ] Bonjour,Je cherche une facon de valider dierctement une action:pendant mon prog j'ai besoin que l'utilisateur appuie sur une touche mais une seule...


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,390 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.