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 :

[langage] problème expression régulière


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 73
    Points : 66
    Points
    66
    Par défaut [langage] problème expression régulière
    Bonjours,
    je ne comprend pas pourquoi je n'arrive pas à récuperer ce qu'il y a entre les deux balise dans la variable $2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    my $lgn = "<!--TABLE1-->chfjichfdsi<!--/TABLE1-->";
    print $lgn;
    if ($lgn =~ /<!--TABLE([0-9]+)-->(.*)<!--\/TABLE$1-->/)
    {
    	print "\nok\n";
    	print "1:$1\n";
    	print "2:$2\n";
    }
    j'ai remarqué que si on retire --> aprés $1 ça marche (mais c'est pas vraiment ce que je veux)
    c'est donc à cause de --> àprés $1 mais pourquoi ???

  2. #2
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    Bonjour,

    Tu ne peux utiliser $1 dans la meme expression reguliere. Car l'interpolation des variables se fait avant la gestion de l'expression.
    Voila ce que tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    my $lgn = "<!--TABLE1-->chfjichfdsi<!--/TABLE1-->";
    print $lgn . "\n";
    if ($lgn =~ /<!--TABLE([0-9]+?)-->(.*?)<!--\/TABLE[0-9]+?-->/)
    {
        print "\nok\n";
        print "1: $1\n";
        print "2: $2\n";
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 73
    Points : 66
    Points
    66
    Par défaut
    ok d'accord merci pour l'info
    Je suis obliger de le faire en deux expression régulière donc.
    Un autre problème me viens
    Si la chaine est sur plusieur ligne ligne ou si il y a des \n entre les deux balise je suis tenté d'écrire quelque chose comme ceci mais ca ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    my $lgn = "<!--TABLE1-->chfjichfdsi\n<!--/TABLE1-->"; 
    print $lgn . "\n"; 
     
    if ($lgn =~ /<!--TABLE([0-9]+?)-->/) 
    { 
    	$lgn =~ /<!--TABLE$1-->([.|\n]*)<!--\/TABLE$1-->/gm;
        print "\nok\n"; 
        print "1: $1\n"; 
        print "2: $2\n"; 
    print "3: $3\n"; 
    }
    Merci de m'aider une fois encore

  4. #4
    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 ne peux pas utiliser $1, mais par contre tu peux utiliser \1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    my $lgn = "<!--TABLE1-->chfjichfdsi<!--/TABLE1-->";
    print $lgn;
    if ($lgn =~ /<!--TABLE([0-9]+)-->(.*)<!--\/TABLE\1-->/)
    {
       print "\nok\n";
       print "1:$1\n";
       print "2:$2\n";
    }
    ( heureusement que perl sait faire ça !! )

  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
    Pour répondre à ton deuxième problème "[.|\n]" peut reconnaître un point (juste "." pas n'importe quel caractère) ou "|" ou une fin de ligne.... Ceci parce que "." ou "|" perdent leur sens magique dans une classe de caractère [], ce que tu veux faire est plus probablement ((?:.|\n)*) où (?: ) regroupe les deux alternatives du "|" mais sans les capturer dans une variable.

    Par ailleurs il y a une solution plus jolie, c'est le modificateur /s, qui fait en sorte qu'un "." reconnaisse même les fin de ligne. Le modificateur /m ne sert à rien ici, car il fait en sorte que "^" et "$" reconnaissent le début et la fin d'une ligne, plutôt que le début et la fin de la chaîne.
    Je pense donc que ta regexp devrait être comme ça au final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    my $lgn = "<!--TABLE1-->chfjichfdsi\nblabla<!--/TABLE1-->";
    print $lgn;
    if ($lgn =~ /<!--TABLE(\d+)-->(.*)<!--\/TABLE\1-->/s)
    {
       print "\nok\n";
       print "1:$1\n";
       print "2:$2\n";
    }
    (Pourquoi /g au fait ??)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 73
    Points : 66
    Points
    66
    Par défaut
    g pour recherche global

  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
    Oui, d'accord, mais pour quoi faire ? Tu n'utilise que la première occurrence ici, /g est utile dans une boucle ou pour plusieurs reconnaissances à la suite, mais sinon il ne sert à rien. Nous ne sommes pas ici dans une substitution où l'on doit mettre /g pour que toutes les occurrences soient remplacées.

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

Discussions similaires

  1. [langage] [RegExp] Question d'expression régulière
    Par cloogy dans le forum Langage
    Réponses: 5
    Dernier message: 08/10/2003, 09h29
  2. [langage] [debutant] expression reguliere
    Par toto_titi dans le forum Langage
    Réponses: 3
    Dernier message: 01/07/2003, 09h45
  3. Réponses: 2
    Dernier message: 16/06/2003, 15h15
  4. [langage] surement une expression régulière...
    Par armada dans le forum Langage
    Réponses: 5
    Dernier message: 30/05/2003, 17h06
  5. [langage] expression reguliere motif répétitif dans 1 pattern
    Par comme de bien entendu dans le forum Langage
    Réponses: 11
    Dernier message: 09/04/2003, 16h14

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