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 :

Passer outre les "saut de ligne"


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut Passer outre les "saut de ligne"
    Bonjour a tous,
    voila j ai un probeme lors de la lecture d'un fichier je fais une recherche avec une expression reguliere mais je dois rechercher un element qui se trouve sur plusieurs lignes sauf que le point "." Représente un caractère quelconque, sauf \n (comportement par défaut, modifiable).
    Comment est ce modifiable pour pouvoir parcourir differentes lignes ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     if( ($ligne_fichier) =~/\[.*\[/)
    Merci d avance
    Jules

  2. #2
    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
    C'est dans la doc : perldoc perlre. Le modificateur /s est expliqué dès le début.
    Pour apprendre à te servir de la doc Perl, tu as un très bon article par les mongueurs.

    --
    Jedaï

  3. #3
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Salut !

    Ta réponse est dans la FAQ, rubrique regex.

    Il existe une option de regex qui permet d'ignorer les sauts de lignes.
    C'est le paramètre s.

    N'oublie pas la FAQ, on y trouve beaucoup de réponses

    €dit : argh, trop rapide Jedai, quels réflexes
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Merci pour votre aide mais je voulais savoir si j'ai placé convenablement le s.
    Avec cette expression reguliere elle est censée trouver tout ce qaui est place entre crochet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if( ($Ligne_Fichier) =~/\[.*\[\t+\S/s)

    [groupe] blabllaalmanlal

    blbablihophjfzoejo aefjoopazejfopzej
    fzezehjfilzeh l ihzleih lihlih
    [groupe1]
    [/code]

  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
    Ta regex va matcher :
    un crochet puis un maximum de n'importe quoi, puis un crochet suivi d'un nombre non nul de tabulations (ce qui ne correspond pas à ton exemple), puis un nombre non-nul de caractère non-espace (c'est à dire, ni tabulation, ni espace, ni passage à la ligne).
    J'ai l'impression que tu as fait une erreur en mettant '\t' dans ta regex...
    De plus, telle quelle, ta regex ne va pas matcher entre deux crochets consécutifs, mais entre le premier et le dernier crochet de ta chaîne, ceci étant dû au fait que par défaut le quantificateur '*' est glouton (en fait tous les quantificateurs classiques le sont), et que donc '.*' prend le maximum de caractères possible (et non le minimum comme tu le veux sûrement). Pour rectifier cela, il faut mettre '*?' au lieu de '*', car '*?' est la version paresseuse de '*', il ne matche qu'un minimum de caractère pour que la suite de la regex fonctionne.

    --
    Jedaï

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Bonjour à tous,
    merci Jedai pour tes conseils, j'ai donc modifié ma regex mais je n arrive pas a la verifier et a selectionner ce qui est entre les crochets en gras.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     if( ($Ligne_Fichier) =~/\[(.*?)\[\S /s)
    Si je comprend bien cette regex est censée matcher
    1) elle cherche le [
    2) elle renvoie grace aux parentheses tout ce qui est contenu avant de rencontrer le premier crochet [ qui lui peut etre suivi de n'importe quoi
    3) le "s" a la fin sert a faire abstraction des sauts de lignes


    [groupe] blabllaalmanlal
    blbablihophjfzoejo aefjoopazejfopzej
    fzezehjfilzeh l ihzleih lihlih
    [groupe1] blelabelablablbl

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Sincèrement la je comprend pas pourquoi cette expression reguliere ne recupere pas ce qui est entre crochet [...[
    SVP de l'aide car pour une que je pensais avoir compris un peu les expressions regulieres.

    Jules. :oops: :oops: :oops:

  8. #8
    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
    C'est peut-être une faute de frappe, mais là, tu matche à la fin un '[', puis un caractère non-espace, puis un espace ' '. Si c'est une erreur de copier coller, le problème vient d'ailleurs et tu devrais nous montrer ton code, mais vérifie déjà ça.

    --
    Jedaï

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Points : 78
    Points
    78
    Par défaut
    Merci pour cette idee mais je prefere donner mon code source pour que tu puises te faire une idee.
    Voila mon code source, et j 'ai légèrement modifié mon code source mais pas moyen d'arriver à matcher le bon morceau du fichier !!!!




    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
     
    #!/usr/bin/perl
    use strict;
    my $Ligne_Fichier;
    my $cpt=0;
    my $Addr_Ip;
     
    open(Fichier_Lan,"< base_Lan_perso") || die ("Vérifiez la présence du fichier base_Lan.txt ou son chemin à la ligne :\n $! ");
            while ($Ligne_Fichier = <Fichier_Lan> )
            {
                    next if ($Ligne_Fichier =~ m/^$/);
                    {
                            print("$Ligne_Fichier");
                            if( ($Ligne_Fichier) =~m/(\[.*?)\[/s)
                            {$cpt++;
     
                                    if ( ($Addr_Ip)= (($Ligne_Fichier) =~/\S+\t+(\d+\.\d+\.\d+\.\d+)/sgx))
                                    # expression reguliere qui permet de trouver l'@IP de chaque witch
                                    {
                                            print ("\t\t\t Adresse IP: [$Addr_Ip]");
                                            print("\n");
                                    }
                            }
                    }
            }
    print("Nombre de groupes: $cpt \n");
    close Fichier_Lan;

    Merci Jules

  10. #10
    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
    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
     
    #!/usr/bin/perl
    use strict; 
     
    open(FICHIER_LAN,"< base_Lan_perso") || die ("Vérifiez la présence du fichier base_Lan.txt ou son chemin à la ligne :\n $! "); 
     
    my $content;
    { local $/; $content = <FICHIER_LAN> }
     
    my $cpt = () = ($content =~ m/\[.*?\[/sg);
     
    print "\t\t\t Adresse IP: [$1]\n" while $content =~ m/\S+t+(\d+\.{3}\d+)/g;
     
    print("Nombre de groupes: $cpt \n");
    close FICHIER_LAN;
    --
    Jedaï

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

Discussions similaires

  1. Réponses: 27
    Dernier message: 04/07/2011, 15h57
  2. Passer Outre les required=true
    Par DevServlet dans le forum JSF
    Réponses: 6
    Dernier message: 24/09/2009, 13h55
  3. Réponses: 3
    Dernier message: 06/06/2006, 18h04

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