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 :

Utilisation de variables dans une Expression régulière


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 31
    Points : 19
    Points
    19
    Par défaut Utilisation de variables dans une Expression régulière
    Bonjour,

    J'essaie d'utiliser une variable dans une expression régulière mais en vain

    Je voudrai savoir si je passe par le bon chemin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $expr = "([\d]{22})";
    $expReg = /$expr/;
    $expReg = $1;
    print "Traite le fichier pour le numéro de ligne : ".$expReg."\n";
    J'ai simplifié au maximum le code. En fait, je boucle sur ce bout de code.

    J'utilise cette expression ([\d]{22}) n fois. Je ne connais pas au départ le nombre de boucle. C'est pourquoi j'utilise cette solution.

    Pouvez-vous me dire s'il existe une autre solution (ou une solution de contournement).

    Si je ne suis pas assez clair, faites-le moi savoir.

    En vous remerciant d'avance pour vos réponses.


  2. #2
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Je crois (je ne suis pas sûr) que ce que tu veux c'est simplement récupérer un nombre n de 22 chiffres (!) dans une chaîne et exécuter une boucle quelconque n fois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my $n = $1 if $string =~ /(\d{22})/;
    if (defined $n) {
        for (1..$n) {
            # do what you want
        }
    }
    Pas de panique à propos de la liste du for, là perl est lazy : il n'évalue qu'au fur et à mesure des besoins (il ne crée pas une liste de 10^22 termes !).

    Au fait tu veux vraiment exécuter une boucle 10^22 fois ?

    Si tu veux vraiment utiliser une regex variable, rien de plus simple mais là il te manque déjà l'usage de l'opérateur =~ (au lieu de =).

    La doc est toujours utile: perlre et perlretut.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Bonjour et merci pour cette réponse.

    En fait ce n'est pas ce que je veux faire. J'ai du vraiment mal m'exprimer. Je vais expliquer mon problème plus en détail.

    Je dois, en fait, traiter un fichier formaté de cette façon...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    0049334213000017418101;0049334213000017418201;183083260D-SA01;TTTCH1;2
    0049334213000017418301;183083260D-SA01;TTTCH2;1
    0049334213000017418401;183085525D-SA01;TTTCH1;1
    0049334213000017418501;106510804B-SA01;TTTCH1;1
    0049334213000017418601;0049334213000017418701;0049334213000017418801;054006214G-SA01;TTTCH1;3
    0049334213000017418901;175291311G-SA01;TTTCH1;1
    0049334213000017419001;083007725X-SA01;TTTCH1;1
    Je ne connais pas au départ le nombre de numéro à 22 chiffres par ligne. (ex : 0049334213000017419001)

    Je vais vous montrer ce que j'ai fait. Mon problème est que je ne sais pas comment récupérer les numéros positionnés en deuxième position jusqu'à la énième...

    Je récupère par contre facilement le premier et le dernier.

    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
    while (<>) {
    	#Récupération du nombre de numéro de ligne par ligne
    	$nbNumLigne = /([\d]$)/;
    	$nbNumLigne = $1;
    	#Extraction de tous les numéros de ligne.
    	if ($nbNumLigne == 1) {
    		$expReg = /^([\d]{22});.*/;
    		$expReg = $1;
    		print $nbNumLigne." Traite le fichier pour le numéro de ligne : ".$expReg."\n";
    	} else {
    		$expReg = "";
    		# Définition de l'expression régulière
    		$expr =~ "([\d]{22})";
    		#Boucle sur la ligne et récupération du numéro de la ligne s'il existe plusieurs numéros de ligne.
    		for ($i = 1; $i <= $nbNumLigne; $i++) {
    			#Construction de l'expression régulière récupérant les numéros par ligne.
    			#Expression régulière récupérant le premier numéro.
    			if ($i == 1) {
    				$expReg = /^([\d]{22});.*/;
    				$expReg = $1;
    				print $nbNumLigne." Traite le fichier pour le numéro de ligne : ".$expReg."\n";
    				#Lecture du fichier AC092-Regroup
    				
    			} elsif ($i eq $nbNumLigne) {
    				$expReg = /.*;([\d]{22});[0-9]{9}[\w]{1}-SA[0-9]{2};.{6};[\d]/;
    				$expReg = $1;
    				print $nbNumLigne." Traite le fichier pour le dernier numéro de ligne : ".$expReg."\n";
    			
    			} else {
    				#Pas sûr de l'ajout de l'expression régulière
    				$expReg = $expr.$expr;
    				$expReg = $i;
    				print $nbNumLigne." Traite le fichier pour le numéro de ligne : ".$expReg."\n";
    			}
    		}
    	}
    }
    Est-ce que quelqu'un pourrait m'aider svp!!

    Merci

  4. #4
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    (je n'ai pas le temps d'expliquer, je dois finir un truc urgent)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my @result;
    while (<>) {
        my @codes = /\d{22}/g;
        push @result, @codes[1..$#codes];    # ne récupère que du 2eme au nieme
    }
    print join " ", @result, "\n";

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Merci pour ton aide. J'ai trouvé une solution. Je la partage à tout le monde

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $cible = /(.*);[0-9]{9}[\w]{1}-SA[0-9]{2};.{6};[\d]/;
    @table = split(/;/g,$1);
    #Boucle sur le nombre de numéros de ligne
    for ($i = 0; $i<=$#table; $i++) {
    #Traite l'expression
    }
    Merci encore

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

Discussions similaires

  1. Inclure une variable dans une expression régulière ?
    Par tintin72 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 09/03/2010, 15h02
  2. Parenthèses dans une expression régulière
    Par papyreno dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 10/05/2006, 16h28
  3. Peux on insérer une variables dans une expression calculé
    Par casse.gueule dans le forum Access
    Réponses: 4
    Dernier message: 20/11/2005, 20h10
  4. [EXP] Evaluation dans une expression régulière
    Par SergentHeinz dans le forum Langage
    Réponses: 7
    Dernier message: 10/11/2005, 18h17
  5. Réponses: 6
    Dernier message: 17/08/2005, 12h38

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