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 :

Expression régulière : mauvais parsing


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 35
    Points
    35
    Par défaut Expression régulière : mauvais parsing
    Bonjour,

    J'ai écrit un petit programme permettant de savoir si une chaine de caractère donné contient bien exactement 10 chiffres.

    Le problème, c'est que quand il y a plus de 10 chiffres, le programme m'affiche vrai alors que je voudrais obtenir faux.

    Ce que j'obtiens en sortie :

    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
    num = 06457852
     
    il y a 8 nombres dans cette chaine
     
    faux
     
    num = 0645785278
     
    il y a 10 nombres dans cette chaine
     
    vrai
     
    num = 064578527806
     
    il y a 12 nombres dans cette chaine
     
    vrai


    Le programme est le suivant :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    sub parse_chaine
     
    {
     
                my @tab = @_;
     
     
     
                foreach my $nb(@tab)
     
                {
     
                            print "num = ".$nb."\n";
     
                            print "il y a ".length($nb)." nombres dans cette chaine\n";
     
     
     
                            if($nb =~ m/\d{10}/)
     
                            {
     
                                       print "vrai\n";
     
                            }
     
                            else
     
                            {
     
                                       print "faux\n";
     
                            }
     
                }
     
    }
     
     
     
    parse_chaine("06457852","0645785278","064578527806");
    Merci

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut

    Jasmine,

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Points : 41
    Points
    41
    Par défaut
    Je dirais plutôt :

    Citation Envoyé par Doc Perl
    Par défaut, un sous-motif quantifié est « gourmand », c’est à dire qu’il essaie de se reconnaître un maximum de fois (à
    partir d’un point de départ donné) sans empêcher la reconnaissance du reste du motif. Si vous voulez qu’il tente de se
    reconnaître un minimum de fois, il faut ajouter le caractère "?" juste après le quantificateur. Sa signification ne change
    pas. Seule sa « gourmandise » change :
    *? Reconnait 0 fois ou plus
    +? Reconnait 1 fois ou plus
    ?? Reconnait 0 ou 1 fois
    {n}? Reconnait n fois exactement
    {n,}? Reconnait au moins n fois
    {n,m}? Reconnait au moins n fois mais pas plus de m fois

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Le problème, c'est que quand il y a plus de 10 chiffres, le programme m'affiche vrai alors que je voudrais obtenir faux.

    Avec ? il mettra vrai lorsqu'il aura 12 chiffres alors qu'il doit afficher faux.

    ? => 0 ou 1 fois


    Jasmine,

  5. #5
    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
    {10} et {10}? sont des synonymes, le ? qui transforme un quantificateur en quantificateur paresseux n'a d'effet que si ce quantificateur peut "manger" un nombre variable de symboles.
    Par contre Jasmine a raison, il faut mettre des ancres de début et de fin de chaînes ^ et $ pour que la regex ne matche que si elle reconnaît exactement la chaîne et pas juste une partie.

    --
    Jedaï

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/06/2012, 12h20
  2. Parsing de Date, expression régulière
    Par Lorenzaccio dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/09/2009, 18h05
  3. parse JSON et expression régulière
    Par Bruno2000 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/06/2006, 16h39
  4. Expressions réguliéres
    Par Tooms dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2002, 18h42
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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