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 :

[langage] Problème a priori simple en expressions régulières


Sujet :

Langage Perl

  1. #1
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    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 582
    Points : 2 030
    Points
    2 030
    Par défaut [langage] Problème a priori simple en expressions régulières
    Bonjour !

    Je teste, via le script ci-dessous, le contenu de deux variables par le biais d'expressions régulières. Le but de la manip est de s'assurer, dans le cadre d'un gros programme, que le contenu des deux variables correspond bien aux motifs indiqués dans les expressions régulières.

    Voici le code :
    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
    #!/usr/bin/perl -w
     
    use strict;
     
    my ($alpha, $num);
     
    $alpha = "de";
    $num = 10;
     
    # test de valeur dans $alpha (doit être 'ab', 'bc', 'cd' ou 'de')
    if (! $alpha || $alpha !~ /^ab|bc|cd|de$/) {
        print "\$alpha vide ou motif \"$alpha\" non trouvé\n";
    } else {
        print "motif \"$alpha\" concorde, ok\n";
    }
     
    # test de valeur dans $num (doit être compris entre 1 et 10 inclus)
    if (! $num || $num !~ /^1|2|3|4|5|6|7|8|9|10$/)
    {
        print "\$num vide ou motif \"$num\" non trouvé\n";
    }
    else
    {
        print "motif \"$num\" concorde, ok\n";
    }
    Tant que je donne comme valeurs des chaînes ou nombres correspondant aux motifs recherchés, ça fonctionne, le test des 2 if renvoie VRAI.

    Maintenant, si j'indique 1000 dans $num, ça renvoie VRAI également
    De plus, indiquer "abc" dans $alpha retourne VRAI également.

    Quelqu'un a une idée sur la question ???

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 90
    Points : 96
    Points
    96
    Par défaut
    la ca marche

    il faut que tu mettes des [ ]

    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
    my ($alpha, $num);
     
    $alpha = "abc";
    $num = 1000;
     
    # test de valeur dans $alpha (doit être 'ab', 'bc', 'cd' ou 'de')
    if (! $alpha || $alpha !~ /^[ab|bc|cd|de]$/) {
        print "\$alpha vide ou motif \"$alpha\" non trouvé\n";
    } else {
        print "motif \"$alpha\" concorde, ok\n";
    }
     
    # test de valeur dans $num (doit être compris entre 1 et 10 inclus)
    if (! $num || $num !~ /^[1|2|3|4|5|6|7|8|9|10]$/)
    {
        print "\$num vide ou motif \"$num\" non trouvé\n";
    }
    else
    {
        print "motif \"$num\" concorde, ok\n";
    }

  3. #3
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 69
    Points : 60
    Points
    60
    Par défaut
    pour ta regex /(\d){1,3}/ essaye ca pa le temps de tester desolé pour les chiffrees

    Ludo

  4. #4
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 69
    Points : 60
    Points
    60
    Par défaut
    scuzzzzz j'avais mal lu

    je regarde ton prog et je te donne une reponse tout de suite apres


    Ludo

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    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 582
    Points : 2 030
    Points
    2 030
    Par défaut
    Merci mais en fait, j'avais déjà essayé cette syntaxe que tu me donnes fsapet

    Vois le résultat et admire surtout :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # avec $alpha = "ab" et $num = 10
    $alpha vide ou motif "ab" non trouvé
    $num vide ou motif "10" non trouvé

  6. #6
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 69
    Points : 60
    Points
    60
    Par défaut
    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
    #!/usr/bin/perl -w
     
    use strict;
     
    my ($alpha, $num);
     
    $alpha = "abc";
    $num = 100;
     
    # test de valeur dans $alpha (doit être 'ab', 'bc', 'cd' ou 'de')
    if (! $alpha || $alpha !~ /^(ab|bc|cd|de){1}$/) {
        print "\$alpha vide ou motif \"$alpha\" non trouvé\n";
    } else {
        print "motif \"$alpha\" concorde, ok\n";
    }
     
    # test de valeur dans $num (doit être compris entre 1 et 10 inclus)
    if (! $num || $num !~ /^(1|2|3|4|5|6|7|8|9|10){1}$/)
    {
        print "\$num vide ou motif \"$num\" non trouvé\n";
    }
    else
    {
        print "motif \"$num\" concorde, ok\n";
    }
    et ca normalement c ok
    regarde et dis moi
    a plus et HAPPY perl


  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    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 582
    Points : 2 030
    Points
    2 030
    Par défaut
    Allez, encore plus fort ! Ne boudons pas notre plaisir...

    Le code ci-dessous reprend les modifs apportées par fsapet MAIS les tests sont inversés :
    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
    29
    30
    31
    #!/usr/bin/perl -w
     
    use strict;
     
    my ($alpha, $num);
     
    $alpha = "ab";
    $num = 10;
     
    # test de valeur dans $alpha (doit être 'ab', 'bc', 'cd' ou 'de')
    #if (! $alpha || $alpha !~ /^[ab|bc|cd|de]$/)
    if ($alpha && $alpha =~ /^[ab|bc|cd|de]$/)
    {
        print "motif \"$alpha\" concorde, ok\n";
     
    }
    else
    {
        print "\$alpha vide ou motif \"$alpha\" non trouvé\n";
    }
     
    # test de valeur dans $num (doit être compris entre 1 et 10 inclus)
    #if (! $num || $num !~ /^[1|2|3|4|5|6|7|8|9|10]$/)
    if ($num && $num =~ /^[1|2|3|4|5|6|7|8|9|10]$/)
    {
        print "motif \"$num\" concorde, ok\n";
    }
    else
    {
        print "\$num vide ou motif \"$num\" non trouvé\n";    
    }
    Et voilà ce qui s'affiche en sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $alpha vide ou motif "ab" non trouvé
    $num vide ou motif "10" non trouvé
    Je me fait vieux pour bosser du Perl ou bien ???

  8. #8
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    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 582
    Points : 2 030
    Points
    2 030
    Par défaut
    Citation Envoyé par Ludo167
    et ca normalement c ok
    regarde et dis moi
    a plus et HAPPY perl

    Merci Ludo167, ta méthode fonctionne

    Par contre, je me demande pourquoi est-on obligé de mémoriser (dans $1) le contenu de ce que l'on cherche pour que celà fonctionne !

  9. #9
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 69
    Points : 60
    Points
    60
    Par défaut
    je sais po ce que tu veux en faire apres la recuperer ou autre dc c a toi de voir!!!!
    Mais tu est po obliger !!!!

    Content d'avoir pu t'aider

    Bye

  10. #10
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    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 582
    Points : 2 030
    Points
    2 030
    Par défaut
    Merci vous deux !

    A noter qu'on peut se passer de {1}, ça marche aussi sans.

    Allez zou, direction le tag "résolu"

  11. #11
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    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
    29
     
    #!/usr/bin/perl -w
     
    use strict;
     
    my ($alpha, $num);
     
    $alpha = "ab";
    $num = 10;
     
    # test de valeur dans $alpha (doit etre 'ab', 'bc', 'cd' ou 'de')
    if (! $alpha || $alpha !~ /^[ab|bc|cd|de].$/)
    {
        print "\$alpha vide ou motif \"$alpha\" non trouv   \n";
    }
    else
    {
        print "motif \"$alpha\" concorde, ok\n";
    }
     
    # test de valeur dans $num (doit etre compris entre 1 et 10 inclus)
    if (! $num || $num !~ /^[1|2|3|4|5|6|7|8|9|10].$/)
    {
        print "\$num vide ou motif \"$num\" non trouv       \n";
    }
    else
    {
        print "motif \"$num\" concorde, ok\n";
    }
    Tester et ca marche chez moi,

    Bonne continuation..

    EDIT: OK la version de Ludo fait la meme chose..

    "." veut dire une seule occurence d'un des elements du groupe
    {1} c'est la meme chose (on ne memorise rien dans $1)

    Bulbo

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 90
    Points : 96
    Points
    96
    Par défaut
    Citation Envoyé par Arioch
    Merci mais en fait, j'avais déjà essayé cette syntaxe que tu me donnes fsapet

    Vois le résultat et admire surtout :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # avec $alpha = "ab" et $num = 10
    $alpha vide ou motif "ab" non trouvé
    $num vide ou motif "10" non trouvé
    gasp
    desole

  13. #13
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    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 582
    Points : 2 030
    Points
    2 030
    Par défaut
    Citation Envoyé par fsapet
    gasp
    desole
    spa grave

    Maintenant, je mettrai des ( ) partout dans mon code !!

  14. #14
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 69
    Points : 60
    Points
    60
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # test de valeur dans $alpha (doit être 'ab', 'bc', 'cd' ou 'de')
    if (! $alpha || $alpha !~ /^[ab|bc|cd|de]{1}$/) {
        print "\$alpha vide ou motif \"$alpha\" non trouvé\n";
    } else {
        print "motif \"$alpha\" concorde, ok\n";
    }
     
    # test de valeur dans $num (doit être compris entre 1 et 10 inclus)
    if (! $num || $num !~ /^[1|2|3|4|5|6|7|8|9|10]{1}$/)
    {
        print "\$num vide ou motif \"$num\" non trouvé\n";
    }
    else
    pour info
    {1} veut dire reconait uniquement une seule fois!!! voilà

    Bye Ludo

  15. #15
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Il me semble que si vous essayer par exemple 10 ou ab ça marche pas avec cette regex.... non ? ( [ et ] introduisent une classe de caractère, donc c'est pas bon du tout )

    En fait je ne comprend pas la logique du procédé, ne vaudrait-il pas mieux procéder de façon positive :
    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
     
    #!/usr/bin/perl -w
     
    use strict;
     
    my ($alpha, $num);
     
    $alpha = "de";
    $num = 1000;
     
    # test de valeur dans $alpha (doit être 'ab', 'bc', 'cd' ou 'de')
    unless ( $alpha =~ /^(?:ab|bc|cd|de)$/) {
        print "\$alpha vide ou motif \"$alpha\" non trouvé\n";
    } else {
        print "motif \"$alpha\" concorde, ok\n";
    }
     
    # test de valeur dans $num (doit être compris entre 1 et 10 inclus)
    unless ( $num =~ /^(?:1|2|3|4|5|6|7|8|9|10)$/)
    {
        print "\$num vide ou motif \"$num\" non trouvé\n";
    }
    else
    {
        print "motif \"$num\" concorde, ok\n";
    }
    Là ça marche !

    --
    Jedaï

  16. #16
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    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 582
    Points : 2 030
    Points
    2 030
    Par défaut
    Le pattern /^(1|2|3|4|5|6|7|8|9|10)$/ fonctionne parfaitement.

    Je retrouve bien mes petits dorénavant. Enfin, le bidulemuche que je cherche

  17. #17
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Mon pattern fait exactement la même chose, sauf qu'avec (?: ) tu as l'effet groupant des parenthèses sans l'effet capturant, autrement dit, la regex ne se fatigue pas à stocker des informations que tu n'utiliseras pas plus tard. Ca peut-être utile pour optimiser une regex.

    --
    Jedaï

  18. #18
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    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 582
    Points : 2 030
    Points
    2 030
    Par défaut
    Jedai, tu sais que tu m'énerves là ?


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

Discussions similaires

  1. Petit programme à priori simple
    Par JG35_Illusion dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 05/08/2010, 14h13
  2. Réponses: 6
    Dernier message: 13/07/2010, 10h18
  3. Je bute sur une requête qui est, a priori, simple.
    Par WinNew dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/07/2010, 12h51
  4. Problème a priori simple mais qui rend fou
    Par Fav' da Boy dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 21/09/2009, 18h41
  5. Quel langage de programmation pour des programmes simples ?
    Par Pierre.g dans le forum Langages de programmation
    Réponses: 18
    Dernier message: 22/11/2006, 14h22

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