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 :

convertir chaine en expression régulière


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 99
    Points
    99
    Par défaut convertir chaine en expression régulière
    bonsoir à tous,

    J'ai besoin pour mon programme de convertir une chaine de ce style:

    moi*!*@mon.host.*
    en une expression régulière, ce qui veut dire qu'il faut que j'echappe tout les caractères '*' '?' et '.'

    J'ai réussi a écrire cette fonction, cependant je la trouve vraiment dégueulasse
    J'aurai donc besoin de votre aide pour l'améliorer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char *host = strdup("Cory!*@192.*");
    char *tmphost = convertForRegexp(host);
     
    printf("convert: %s\n", tmphost);
     
    free(host);
    la fonction:
    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
     
    static char *convertForRegexp(char *string)
    {
    	static char result[250];
    	char c, *p = string;
    	unsigned int i = 0;
     
    	while ((c = *p++))
    	{
    		if (c == '*' || c == '?')
    		{
    			result[i++] = '.';
    			result[i++] = *string++;
    		}
    		else if (c == '.')
    		{
    			result[i++] = '\\';
    			result[i++] = '\\';
    			result[i++] = *string++;
    		}
    		else result[i++] = *string++;
    	}
    	result[i] = 0;
    	return result;
    }
    résultat:
    convert: Cory!.*@192\\..*
    La fonction fonctionne mais je pense qu'il a vraiment moyen de faire mieux,
    merci à vous et bonne soirée.

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    L'utilisation d'un switch() permettrait d'éviter les if..else et rendrait le code plus clair :
    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
    static char *convertForRegexp(char const *string)
    {
       static char result[250];
       unsigned int i;
       for(i=0; *string != '\0'; i++, string++)
       {
          switch(*string)
          {
            case '*' :
            case '?' : result[i++] = '.' ;
                       break;
            case '.' : result[i++] = '\\' ;
                       result[i++] = '\\' ;
                       break;
          }
          result[i] = *string;
      }
      result[i] = 0;
      return result;
    }

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 99
    Points
    99
    Par défaut
    salut diogene et merci pour ta réponse, ca fonctionne comme il faut.
    Par contre j'ai un soucis lors de la comparaison entre les chaines, ca ne semble plus matcher correctement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	char hostmask[MASKLEN+1];
    	char *tmphost = convertForRegexp("havoc!*@192.*");
     
    	if (parc < 2)
    		return irc_notice(client->nick, "Syntaxe: login <idnick> <password>");
     
     
    	sprintf(hostmask, "%s!%s@%s", client->nick, client->user, client->host);
    	if (!regexcmp(hostmask, tmphost))
    		return irc_notice(client->nick, "Les masques ne correspondent pas. %s - %s", hostmask, tmphost);
    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
     
    static int regexcmp(const char *s1, const char *s2)
    {
    	regex_t myreg;
    	unsigned int flags = (REG_ICASE|REG_NOSUB|REG_EXTENDED);
     
    	if (regcomp(&myreg, s1, flags) != 0)
    		return 0;
     
    	if (regexec(&myreg, s2, 0, NULL, 0) != 0)
    		return 0;
     
    	regfree(&myreg);
    	return 1;
    }
    résultat:
    [21:34:43] Notice Bot:havoc Les masques ne correspondent pas. havoc!havoc@192.168.1.20 - havoc!.*@192\\..*
    la chaine semble pourtant bien converti en expression régulière

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            case '.' : result[i++] = '\\' ;
                       result[i++] = '\\' ;
                       break;
    Il y a une ligne en trop.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 99
    Points
    99
    Par défaut
    même comme ca, ca ne fonctionne pas, je comprend pas bien ca fonctionnait avant ...

Discussions similaires

  1. [RegExp] comparaison début d'une chaine par expressions réguliéres.
    Par madina dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/11/2011, 12h43
  2. Découpage d'une chaine via expressions régulières
    Par 65days dans le forum Général Java
    Réponses: 3
    Dernier message: 07/12/2009, 21h02
  3. Extraire une chaine via Expression Régulières ?
    Par Fikou-Sama dans le forum VB.NET
    Réponses: 3
    Dernier message: 11/09/2009, 16h58
  4. Substition de chaines via expressions régulières
    Par Katyucha dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 28/02/2007, 09h53
  5. Réponses: 7
    Dernier message: 27/10/2005, 19h23

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