/*************************************************************************************************************************************/ /* */ /* T E S T D E S F O N C T I O N S D E G E S T I O N D E S */ /* " E X P R E S S I O N S " R E G U L I E R E S ( A L A ' sed ' ) */ /* A V E C U T I L I S A T I O N D ' I N D E X */ /* E T T E S T D E S M A J U S C U L E S / M I N U S C U L E S */ /* E T T E S T D E S S O U S - E X P R E S S I O N S P O U R ' SYSTEME_APC_LinuxRedHat_GCC ' : */ /* */ /* */ /* Author of '$xtc/regul_exp.31$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, AAAAMMJJhhmmss). */ /* */ /*************************************************************************************************************************************/ extern void *malloc(); #include <stdio.h> #include <regex.h> #define LONGUEUR \ 10000 main() { char *expression_reguliere="O"; /* Avec "\n" il y a un "vrai new-line" mis dans la chaine et alors reconnu comme tel */ /* ensuite, alors que "\\n" qui devrait mettre les 2 caracteres "\" et "n" n'est pas */ /* reconnu ensuite comme un "new-line"... */ char *chaineA="NOUS partimes 500 mais par un prompt renfort,\nn\nous nous vimes 3000 en arrivant au PORT"; char *sous_chaineA; int indexA; char *chaineR; int indexR; char *chaineS="+"; regex_t expression_compilee; int iterer=0; printf("\n expression reguliere=\n%s",expression_reguliere); chaineR=malloc(2*strlen(chaineA)); if (regcomp(&expression_compilee,expression_reguliere,REG_EXTENDED) != 0) { printf("\n probleme dans la compilation de l'expression reguliere"); } else { } printf("\n nombre de sous-expressions=%d",expression_compilee.re_nsub); sous_chaineA=chaineA; indexA=0; indexR=0; while (iterer == 0) { #define NMATCH 10 #define DEB(n) (sous_chaineA + (pmatch[n].rm_so)) #define FIN(n) (sous_chaineA + (pmatch[n].rm_eo)) #define loc1 DEB(0) #define loc2 FIN(0) int nmatch=NMATCH; regmatch_t pmatch[NMATCH]; if (regexec(&expression_compilee,sous_chaineA,nmatch,pmatch,RE_SYNTAX_SED) == 0) { int indexS=0; int NSousExp=0; for (NSousExp=1 ; NSousExp<=expression_compilee.re_nsub ; NSousExp++) { char *SousExp; printf("\n sous-expression(%d)=",NSousExp); for (SousExp=DEB(NSousExp) ; SousExp<FIN(NSousExp) ; SousExp++) { printf("%c",*SousExp); } } for (indexA=indexA ; indexA<(loc1-chaineA) ; indexA++) { *(chaineR+indexR) = *(chaineA+indexA); indexR++; } for (indexS=indexS ; indexS<strlen(chaineS) ; indexS++) { *(chaineR+indexR) = *(chaineS+indexS); indexR++; } sous_chaineA=loc2; indexA=sous_chaineA-chaineA; } else { iterer++; } } regfree(&expression_compilee); for (indexA=indexA ; indexA<strlen(chaineA) ; indexA++) { *(chaineR+indexR) = *(chaineA+indexA); indexR++; } *(chaineR+indexR) = 0; printf("\n chaineA=\n%s",chaineA); printf("\n chaineR=\n%s",chaineR); printf("\n"); }