IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[regex] validation d'une chaine de caracteres


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 17
    Par défaut [regex] validation d'une chaine de caracteres
    bonjour,

    je souhaitais valider un chaine de carateres a l'aide de regex.

    le format de ma chaine doit etre strinctement
    (chaine de caracteres sans espaces, un espace,un point-virgule (et rien d'autre)

    par exemple :
    OK
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "1aX ;"
    "a ;"
    "a222aaaA ;"
    NOK
    NOK
    NOK
    NOK


    ect ect

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    	int err;
    		int match;
    		int a = 0;
    		regex_t preg;
    		const char *str_regex = "(^[[:alnum:]]+ ;)"
    		const char *str_request = "2X ;";
     
    		err = regcomp (&preg, str_regex, REG_NOSUB | REG_EXTENDED);
    		if (err == 0) {
    		      match = regexec (&preg,str_request, 0, NULL, 0);
    		      regfree (&preg);
    		      if (match == 0){
    		    	  a = 1;
    		    	  printf("%d",a);
    		    	  return 1;
    		      }
    		     printf("%d",a);
                        }
    ma fonction doit retourner 1 si c'est bon.

    si je tape elle retourne 1 alors que c'est NOK
    je veux pas uniquement savoir si elle a trouver un motif dans ma chaine, je veux savoir si la chaine correspond exactement au motif

    comment faire ?
    merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2011
    Messages : 71
    Par défaut Pourquoi ne pas utiliser sscanf
    Bonjour,

    Alors je n'ai malheureusement pas eu l'occasion d'utiliser la bibliothéque regexp en C, en revanche, on peut s'en tirer avec un sscanf()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    int isCorrect(const char* str)
    {
            int res = 0;
    	char* chaine = malloc(strlen(str)+1);
    	char espace,point_virgule,en_trop;
     
    	if(sscanf(str,"%s%c%c%c",chaine,&espace,&point_virgule,&en_trop) == 3 && espace == ' ' && point_virgule == ';')
            {
    		res = 1;
    	}
            free(chaine);
    	return res;
    }
     
    int main(void)
    {
    	int i;
    	const char* expr[7] = 
    	{
    	 "1aX ;","a ;","a222aaaA ;",
    	 "1a"," 1a","1a ;az; "," 1X;"
    	};
     
    	for(i=0;i<7;i++) printf("%d\n",isCorrect(expr[i]));
     
            return EXIT_SUCCESS;
    }
    ça peut paraitre un peu loud mais ça fontionne parfaitement du moins avec tes exemples

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 17
    Par défaut
    je souhaite utiliser la lib regex

    en plus le nombre de caractere de [A-Z 0-9 a-z] est variable .
    j'ai juste donné des exemple pour expliciter ce que je veux .
    ils sont à titre indicatif uniquement

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2011
    Messages : 71
    Par défaut Dans ce cas...
    "en plus le nombre de caractère de [A-Z 0-9 a-z] est variable ."

    Ben la ça devrait fonctionner dans tout les cas je crois.
    Par contre si il te faut de la regexp, je peux pas t'aider va falloir attendre ceux qui y ont déjà touché vu que j'ai jamais eu besoin de dépasser sscanf().

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 17
    Par défaut
    pour simplifier :
    je veux que mon motif soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "[RIEN](^[[:alnum:]]+ ;)[RIEN]"
    mais le [RIEN] je ne sais pas le coder

    Resolu :

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Validation d'une chaine par Regex sous vb.net
    Par Lamanne dans le forum VB.NET
    Réponses: 10
    Dernier message: 27/03/2012, 07h58
  2. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  3. [Regex]Match d'une regexp avec une chaîne avec caractères spéciaux
    Par gdawirs dans le forum Collection et Stream
    Réponses: 13
    Dernier message: 25/11/2005, 12h24
  4. Réponses: 2
    Dernier message: 30/03/2004, 11h31
  5. Controler une chaine de caracteres ou d'entiers?
    Par Le druide dans le forum C
    Réponses: 6
    Dernier message: 25/09/2003, 08h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo