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é
    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 éprouvé
    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é
    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 éprouvé
    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é

    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 éprouvé
    Citation Envoyé par d-jo
    comment faire pour que \d{4} devienne longueur = 4 et :
    N'est-ce pas \d{4,4} ?

###raw>template_hook.ano_emploi###