1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <regex.h>
int main(void) {
char *Chaine = NULL;
regex_t MotifCompile;
regmatch_t *TableauSousExpressions = NULL;
const char *Motif = "^\\b([0-9A-Za-z_-]*)@{1}[0-9A-Za-z_-]{2,15}\\.[A-Za-z]{2,3}\\b$";
char *MessageErreur = NULL;
int ErreurRegex,LongeurMaxMsgErreur,NombresSousChaines,ErreurComparaison,LongueurSousChaine,Compteur;
assert(Chaine == NULL);
Chaine = (char*)malloc(256);
if (Chaine == NULL) {
perror("malloac");
exit(1);
}
fgets(Chaine,256,stdin);
ErreurRegex = regcomp(&MotifCompile,Motif,REG_EXTENDED | REG_NEWLINE);
if (ErreurRegex != 0) {
LongeurMaxMsgErreur = regerror(ErreurRegex,&MotifCompile,NULL,0);
assert(MessageErreur == NULL);
MessageErreur = (char*)malloc(LongeurMaxMsgErreur);
if (MessageErreur == NULL) {
perror("malloc");
exit(1);
}
regerror(ErreurRegex,&MotifCompile,MessageErreur,LongeurMaxMsgErreur);
fprintf(stderr,"Erreur : %s\n",MessageErreur);
assert(MessageErreur != NULL);
free(MessageErreur);
MessageErreur = NULL;
exit(1);
}
NombresSousChaines = MotifCompile.re_nsub + 1;
fprintf(stdout,"Nombre sous chaînes = %d\n",NombresSousChaines);
assert(TableauSousExpressions == NULL);
TableauSousExpressions = (regmatch_t*)malloc(NombresSousChaines*sizeof(regmatch_t));
if (TableauSousExpressions == NULL) {
perror("malloc");
exit(1);
}
ErreurComparaison = regexec(&MotifCompile,Chaine,NombresSousChaines,TableauSousExpressions,REG_NOTEOL);
if (ErreurComparaison == REG_ESPACE) {
fprintf(stderr,"Erreur fatale\n");
exit(1);
}
if (ErreurComparaison == REG_NOMATCH) {
fprintf(stderr,"pas de correspondance.\n");
exit(1);
}
for (Compteur = 0 ; Compteur < NombresSousChaines; Compteur++) {
LongueurSousChaine = TableauSousExpressions[Compteur].rm_eo - TableauSousExpressions[Compteur].rm_so;
fprintf (stdout,"Correspondance = %s\n",(char*) (Chaine+TableauSousExpressions[Compteur].rm_so));
}
assert(TableauSousExpressions != NULL);
free(TableauSousExpressions);
TableauSousExpressions = NULL;
NombresSousChaines = 0;
regfree(&MotifCompile);
assert(Chaine != NULL);
free(Chaine);
Chaine = NULL;
return(0);
} |
Partager