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

Langage Perl Discussion :

Utilisation incongrue des regex


Sujet :

Langage Perl

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Août 2005
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 118
    Points : 142
    Points
    142
    Par défaut Utilisation incongrue des regex
    Bonjour,
    Désolé pour le titre peu évocateur.

    Voilà, un petit problème qui se pose à moi et que je ne sais comment résoudre.

    J'ai un programme qui doit recevoir une regex en argument.

    Ensuite, il reçoit un chaîne caractères par caractères

    A chaque acquisition, il doit répondre si ce caractère est bon ou non.

    Exemple

    La regex : /w{6,8} un mot composé de 6 à 8 caractères alphanumeriques

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    caractère 1 : a 
    réponse oui
    caractère 2 : 3
    réponse oui
    caractère 3 : /
    réponse non
    La question est de savoir s'il est possible d'utiliser le moteur de regex de perl pour faire ça et surtout comment ?

    Je peux toujours faire un truc limité a la main avec une syntaxe simplifiée, mais je trouve ça tellement dommage que je sollicite vos brillantes idées.

    Merci
    Joris

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Ce qui suit est une vielle fonction qui date de 2001 (je précise avant que Jedai ne vienne dire qu'il a trouvé bien mieux, ça m'fait une excuse )

    Cette fonction vérifie une saisie au clavier (1er paramètre envoyé à la fonction), le nombre de caractères de la chaine en question ainsi qu'un pattern en 3è paramètre. Ce pattern est une regexp simple.

    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
    sub VerifSaisie
    {
    	# récup de la chaine saisie, de la longueur autorisée et du pattern
    	my ($Chaine, $Longueur, $Pattern) = @_;
     
    	# vérification de la chaine saisie
    	if ($Chaine !~ /^[$Pattern]{1,$Longueur}$/)
    	{
    		if (! $Chaine)
    		{
    			print "aucune valeur n'a été saisie !\n";
    		}
    		elsif (length($Chaine) > $Longueur)
    		{
    			print "max autorisé = $Longueur caractère(s) !\n";
    		}
    		else
    		{
    			print "caractères saisis non autorisés !\n";
    			print "caractères admis : <$Pattern>\n";
    		}
    		return 0;
    	}
    	return 1;
    }
    La fonction renvoie 1 si ok, 0 sinon.

    Et pour donner un apperçu de son usage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $chaine = "pouet";
    $longueur = 30;
    $pattern = "a-zA-Z0-9àâäéèêëîïôöùûüç' -";
     
    die ("saisie erreur !") if (! VerifSaisie($chaine, $longueur, $pattern));
    Voilà. A toi d'adapter selon tes besoins

  3. #3
    Membre habitué

    Profil pro
    Inscrit en
    Août 2005
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 118
    Points : 142
    Points
    142
    Par défaut
    Merci pour cet exemple, mais ce n'est pas tout à fait ce que je veux faire.
    La vérification doit se faire, c'est incontournable, caractère par caractère.

    Un exemple vite fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    #$regexp = "\d{4}";
    $chaine = '';
     
    while(1){
       $char = acquerir_char();
       if($char =~ /\d/ ){ $chaine .= $char; }
       last if(length($chaine) == 4 );
    }
    L'idée étant que les conditions (ici le bloc while) puisse être directement paramétrées par une regex passée en paramètre.

    Joris

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Hum, en adaptant ma fonction selon tes besoins spécifiques, ça me semble tout à fait réalisable.

    Je dis bien : en adaptant la fonction.

  5. #5
    Membre habitué

    Profil pro
    Inscrit en
    Août 2005
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 118
    Points : 142
    Points
    142
    Par défaut
    Hum, en adaptant ma fonction selon tes besoins spécifiques, ça me semble tout à fait réalisable.

    Je dis bien : en adaptant la fonction.
    Je bloque en fait sur la décomposition de la regxep.

    comment faire pour que \d{4} devienne longueur = 4 et :
    premier caractère \d
    second caractère \d
    troisième caractère \d
    ...

    Je suis en train de regarder du côté de Regexp:arser mais ça ne me semble pas gagné.

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Citation Envoyé par d-jo
    comment faire pour que \d{4} devienne longueur = 4 et :
    N'est-ce pas \d{4,4} ?

Discussions similaires

  1. Probleme d'utilisation des Regex
    Par krisox dans le forum C#
    Réponses: 6
    Dernier message: 03/05/2010, 19h30
  2. Utilisation des Regex avec Boost
    Par Inarius dans le forum Boost
    Réponses: 1
    Dernier message: 20/01/2010, 13h47
  3. [tcprewrite] utilisation des regex
    Par dahtah dans le forum Réseau
    Réponses: 0
    Dernier message: 01/10/2008, 13h12
  4. [RegEx] Utilisation des regex
    Par djus29 dans le forum Langage
    Réponses: 7
    Dernier message: 21/05/2008, 17h43

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