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 : [0-9]*


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Billets dans le blog
    14
    Par défaut Expression régulière : [0-9]*
    Bonjour,
    j'utilise les expressions régulières en sas.
    je cherche à comprendre pourquoi [0-9]*
    Sélectionne une qui chaine commence par un chiffre "0125a"
    et pas celle qui commence par un caractère : "a012bc"
    merci.
    Cordialement

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 138
    Par défaut
    Bonjour,

    le motif [0-9]* représente 0 ou n fois un chiffre de 0 à 9
    Tes deux chaines de caractères matchent bien, la première commençant par une occurrence de 0, la seconde commençant par aucune occurrence de 0

    Exemple sous le debugger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      DB<13> print 'Match' if '0125a' =~ /^[0-9]*/
    Match
      DB<14> print 'Match' if 'a012bc' =~ /^[0-9]*/
    Match

  3. #3
    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
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Citation Envoyé par m.brahim Voir le message
    je cherche à comprendre pourquoi [0-9]*
    Sélectionne une qui chaine commence par un chiffre "0125a"
    et pas celle qui commence par un caractère : "a012bc"
    Ça ne devrait pas être le cas. Comme l'a montré Ptonnerre, [0-9]* devrait reconnaître les deux chaînes, y compris "a012bc".

    Si tu n'as pas ça, montre la totalité de ton expression régulière, pas juste un petit bout.

  4. #4
    Membre émérite
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Billets dans le blog
    14
    Par défaut
    Merci pour vos réponses.
    J'ai mal posé la question.

    A partir de la table test, si je matche ces données, en effet les deux enregistrements sortent.

    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 test;
    input var $;
    cards;
    0125a
    a012bc
    ;run;
     
    data test1 ;
    set test;
    length var1 $8.; 
    IF _N_ = 1 THEN RE = PRXPARSE("/[0-9]*/");;
    retain re;
    if PRXmatch(RE,var) gt 0 then output;
     
    run;
    Par contre, si je veux extraire le premier caractère numérique ou plus qui se succèdent, voici les résultats:
    1/ le premier enregistrement revoit dans la variable var1: 0125
    2/ le deuxième enregistrement revoit dans la variable var1: vide

    Avec [0-9]+, ça fonctionne:
    1/ le premier enregistrement revoit dans la variable var1: 0125
    2/ le deuxième enregistrement revoit dans la variable var1: 012
    Et pour cela que je cherche à comprendre pourquoi avec [0-9]* ne me revoit pas 012.
    merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    data test1 ;
    set test;
    length var1 $8.; 
    if _n_=1 then IF _N_ = 1 THEN RE = PRXPARSE("/[0-9]*/");;
    retain re;
    CALL PRXSUBSTR(RE,var,START,LENGTH);
    IF START GT 0 THEN DO;
    ZIP_CODE = SUBSTRN(var,START,LENGTH );
    output;
    end;
    run;

  5. #5
    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
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    je vois que ce n'est pas du Perl. Tu n'es donc pas sur la bonne rubrique du forum.

    Je répondrai toutefois que l'expression régulière /[0-9]*/ peut reconnaître 0 ou plusieurs chiffres. Si la chaîne commence par un chiffre (par exemple 0125a), la regex reconnaître tous les chiffres du début de la chaîne, donc 0125.

    Si la chaîne ne commence pas par un chiffre (par exemple a012bc), la regex /[0-9]*/ reconnaît un motif contenant 0 chiffre en début de chaîne. En utilisant /[0-9]+/, tu garantis que la regex doit reconnaître un ou plusieurs chiffres, donc au moins un chiffre, de la chaîne; la regex reconnaîtra alors 012.

    Exemple sous le débogueur en Perl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      DB<6> print "OK" if 'a012bc' =~ /([0-9]*)/
    OK
      DB<5>  print $1 if 'a012bc' =~ /([0-9]*)/
    Premier test: la chaîne est reconnue par le motif (donc succès de la regex)
    Deuxième test: mais la chaîne capturée est vide

Discussions similaires

  1. [RegEx] Expression régulières : Balises <SCRIPT>
    Par Gwipi dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2006, 23h25
  2. Expression réguliére
    Par Mad_Max dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 16/09/2003, 18h17
  3. [expression régulière] mon cerveau fait des noeuds..
    Par nawac dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/05/2003, 10h06
  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