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 :

match chaine de caractères


Sujet :

Langage Perl

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 210
    Points : 147
    Points
    147
    Par défaut match chaine de caractères
    Bonjour,
    Une question a priori toute simple, de la part d'un débutant Perl (en expressions régulières Perl, plus précisément !)
    Je souhaiterais contrôler le bon format des numéros de téléphone (10 chiffres et rien que 10 chiffres) dans une table SAS. J'utilise l'expression régulière suivante :
    et SAS me retourne un résultat 'OK' pour un no comportant plus de 10 chiffres.
    Merci pour vos réponses

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    si je comprends bien, en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $chaine = 12345678901;
    print "OK\n" if ($chaine =~ /\d{10}/);
    tu obtients "OK"

    ça me parait plutôt bizarre la seule chose que j'ai envie de te demander même si ça peut paraître évident tu n'aurais pas mis "!~" au lieu de "=~"?
    et pour les numéros à 10 chiffres tu obtiens quoi? "OK" aussi?

    Pourrais-tu mettre un exemple et éventuellement un bout de code afin de pouvoir regarder

  3. #3
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Citation Envoyé par jlp65 Voir le message
    Bonjour,
    Une question a priori toute simple, de la part d'un débutant Perl (en expressions régulières Perl, plus précisément !)
    Je souhaiterais contrôler le bon format des numéros de téléphone (10 chiffres et rien que 10 chiffres) dans une table SAS. J'utilise l'expression régulière suivante :
    et SAS me retourne un résultat 'OK' pour un no comportant plus de 10 chiffres.
    Merci pour vos réponses
    Si tu mets $ entre guillemets, il y a des fortes chances que le $ soit interprété comme une variable, et donc perde son sens dans l'expression régulière.
    évite de mettre les slashs dans le pattern aussi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #!/usr/bin/perl
     
    my $pattern = '/^\d{10}$/';
    my $pattern2 = '^\d{10}$';
    my $pattern3 = "^\\d{10}\$";
     
    my @test = ( '0123456789', 'A0123456789A', '01234567890' );
     
    foreach my $check (@test){
            printf "1 - $check:ok\n" if ($check =~ $pattern);
            printf "2 - $check:ok\n" if ($check =~ /$pattern2/);
            printf "3 - $check:ok\n" if ($check =~ /$pattern3/);
    }
    Le script renvoie :
    2 - 0123456789:ok
    3 - 0123456789:ok
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 210
    Points : 147
    Points
    147
    Par défaut
    En fait, j'ai évité de mettre du code puisque je suis en SAS et pas en Perl. Mais voici quand même, donc, 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
     
    data phone_numbers;
    	length first last phone $ 16;
    	input first last phone & $16.;
    	datalines;
    	Thomas Archer 0123456789
    	dudule Moins 0123
    	Lucy Barr 0123456789
    	Tom Joad A123456789
    	Laurie Gil 0123456789542
    ;
    data invalid;
    	set phone_numbers;
    	where not prxmatch	('/^\d{10}$/',phone);
    run; 
    proc print;run;
    J'ai testé avec les 3 patterns et, à chaque fois, cela ne me sort pas les mauvais numéros. En fait, maintenant, SAS me retourne l'ensemble des enregistrements !! J'y perds un peu mon latin, là !

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 210
    Points : 147
    Points
    147
    Par défaut
    Si j'enlève le "$" et le "^", il m'en signale 2 comme inexacts : Dudule et Tom ... mais pas Laurie !
    Citation Envoyé par jlp65 Voir le message
    J'ai testé avec les 3 patterns et, à chaque fois, cela ne me sort pas les mauvais numéros. En fait, maintenant, SAS me retourne l'ensemble des enregistrements !! J'y perds un peu mon latin, là !

  6. #6
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    as-tu un moyen de savoir quelle chaîne de caractères tu testes ?
    j'ai l'impression que tu testes sur toute ta ligne à chaque fois, et pas juste le numéro

    avec '/^\d{10}$/', toutes les lignes sont retournées puisque aucune n'est constituée uniquement d'un nombre à 10 chiffres (le nom fait partie de la ligne ? des espaces qui traînent ?)
    et avec '/\d{10}/' cela te retourne toutes les lignes où il n'y a pas un nombre à au moins 10 chiffres, donc dudule et tom.

    au lieu des limites de ligne ^$, essaie d'utiliser le word boundary \b:
    /\b\d{10}\b/
    pour voir ?
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 210
    Points : 147
    Points
    147
    Par défaut
    La chaine considérée est bien celle concernant le téléphone uniquement (2e argument de la fonction prxmatch).
    Avec les word boundary, je retrouve tout mon petit monde (Laurie comprise).

    (je pensais que {10} signifiait 10 fois exactement, c'est ce que j'ai lu quelque part)

    Merci beaucoup !

  8. #8
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jlp65 Voir le message

    (je pensais que {10} signifiait 10 fois exactement, c'est ce que j'ai lu quelque part)
    Oui, c'est ce que ça veut dire. Mais si tu as 12 chiffres, le moteur de regex va reconnaître exactement les 10 premiers et sera content.

    Si tu veux regrouper un groupe de 10 chiffres et seulement 10 chiffres, il faut dire au moteur de regex que tu veux 10 chiffres et qu'en outre ce qu'il y a avant et après ces 10 chiffres ne soient pas des chiffres. Ce que tu as fait, apparemment, avec les word boundaries.

  9. #9
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par 6ril23 Voir le message
    si je comprends bien, en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $chaine = 12345678901;
    print "OK\n" if ($chaine =~ /\d{10}/);
    tu obtients "OK"

    ça me parait plutôt bizarre
    Bien sûr que si tu fais cela, ça va marcher. Perl va reconnaître 10 chiffres, comme dans l'exemple ci-dessous à la ligne de commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $ perl -e 'print "OK\n" if "12345678912345678" =~ /\d{10}/;'
    OK
    Mais si tu ajoutes des ancres de début de de fin, alors là tu n'auras pas OK:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $ perl -e 'print "OK\n" if "12345678912345678" =~ /^\d{10}$/;'
    De même avec des ancres de limite de mot:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ perl -e 'print "OK\n" if "12345678912345678" =~ /\b\d{10}\b/;'

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  2. Matching entre chaines de caractères
    Par shenron666 dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 13/10/2005, 16h39
  3. Réponses: 9
    Dernier message: 17/01/2003, 11h45
  4. Lire Une Chaine De Caractères
    Par Jonathan_Korvitch dans le forum C
    Réponses: 12
    Dernier message: 07/01/2003, 05h37
  5. Réponses: 2
    Dernier message: 06/12/2002, 07h50

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