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 :

Créer des sous chaines à partir d'expressions régulières


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 18
    Points : 15
    Points
    15
    Par défaut Créer des sous chaines à partir d'expressions régulières
    Bonjour,

    J'ai la boucle suivante qui marche mais ne me satisfait pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if( $_ =~ /$regExpImage/ ) {
          my $image =  $& ;
          print $image ;
          if( $_ =~ /[[:digit:]]{1,2}\/[[:alpha:]]{3}\/[[:digit:]]{4}:[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2}/ ){
             my $date =  $& ;
             print $date ;
          }
    }
    En fait je ne sais pas comment affecter une variable à partir d'une expression régulière. En gros, faire un truc qui donne :
    $mavariable = partie de $machainecomplete répondant à l'expression régluière
    $mavariable2 = partie de $machainecomplete répondant à une autre expression régluière

    Celà permettrait d'éviter d'utiliser des if inutiles, des $_ à répétition, et des $& qui parait il ralentissent le code.

    Merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 46
    Points : 49
    Points
    49
    Par défaut
    Bonjour

    Il te faut matcher ta regexp avec des parenthèses () autour de ce qui t'intéresse. Ensuite $1 contient ce qui a été matché dans la première parenthèse, $2 dans la deuxième ....

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $t = "abc/hello/def/world/fghhd";
    if ($t =~ /\/(.*?)\/.*?\/(.*?)\// ) {
         print $1."\n";
         print $2."\n";
    }
    renvoit un joli :

  3. #3
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    j'en fait reference dans la FAQ Perl de ce forum. Bonne lecture!!!

  4. #4
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Merci à vous, ça marche et c'est plus joli.

  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
    Il vaut mieux également éviter d'utiliser $& car l'usage de ces variables oblige le moteur de regex à effectuer des opérations supplémentaires et donc ralentit toutes les regexs du script.

    --
    Jedaï

  6. #6
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Merci Jedai,

    tu as une solution pour éviter celà ?
    Est ce que les $1 et $2 posent le même problème ?

  7. #7
    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
    Tu n'utilises pas $&, c'est tout. Tu peux tout à fait remplacer $& par $1 en entourant toute la regex avec des parenthèses, mais pour ses petites soeurs $' et $`, c'est plus délicat... La solution : on peut utiliser les variables spéciales @+ et @- en conjonction avec substr() pour les simuler. (si tu ne comprends pas ce que je raconte, jette un coup d'oeil à "perldoc perlvar" et "perldoc -f substr" pour des éclaircissements)

    --
    Jedaï

  8. #8
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Merci Jedai,

    Si c'est bon je crois avoir compris

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

Discussions similaires

  1. Extraction d'une sous-chaine à partir d'une chaine principale
    Par gazere dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 13/06/2007, 04h08
  2. Réponses: 3
    Dernier message: 17/04/2007, 15h58
  3. Réponses: 1
    Dernier message: 06/04/2007, 21h28
  4. Réponses: 6
    Dernier message: 17/01/2007, 12h30
  5. Créer des clés informatiques à partir d'1 base de données??
    Par Flateric dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 11/02/2005, 07h49

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