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 simple


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 53
    Points : 23
    Points
    23
    Par défaut Expression régulière simple
    Bonjour à tous,

    Je dispose d'un script comme ceci (ce n'est qu'un exemple que je met entre balises code parce qu autrement il ne reconnait pas les espaces que je met):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    *  Bonjour
    *               aaaaaa                                   
    *  je
    *      aaaaa
                                 aaaaa
    *                  aaaa
    *  m'appelle
    *  Bernard
      aaaaa
    *aaaa
    *                   aaaaaaa
    Je cherche à isoler uniquement les lignes qui possèdent une étoile (*) et deux espaces derrière (dans ce cas la pour former la phrase "Bonjour je m'appelle Bernard")

    N'étant pas bon en expressions régulières je ne vois pas trop comment faire...

    Merci d'avance!

  2. #2
    Membre habitué Avatar de minus
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 153
    Points : 177
    Points
    177
    Par défaut
    Je te donne la solution, mais si tu veux arriver a faire des regex tout seul va falloir mettre les mains dans le cambouis et les FAQ pour comprendre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ($string =~ /^\*\s{2}(.*)/ ) {
        my $result = $1;
    }
    Bon je t'explique un peu quand meme :
    - "/^" ca va obliger l'expression a chercher en debut de chaine
    - "\*\s{2}" si je me trompe pas ca va chercher l'expression "* et deux espaces" (on utilise le \ pour proteger les caracteres qui sont aussi des regex)

    - "(.*)" va mettre en memoire toute la suite de la chaine dans la variable $1



    Bon voila, mais un conseil quand meme : passe du temps a essayer de comprendre les expressions regulieres car c'est un des gros benefice du perl
    Science sans conscience n'est que ruine de l'âme

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 53
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    Tout d'abord merci pour ta réponse!

    J'ai essayé ton code mais il ne marche pas... Je pense comprendre pourquoi.

    En effet ton code isole les lignes (* et deux espaces) mais une ligne qui possède une etoile et trois espaces possède aussi une étoile et deux espaces.

    En regardant dans l'introduction au perl dispo sur ce site ils disent que {n} veux dire exactement n fois donc ton code devrait marcher... à moins que en regex quand on reconnait n+1 élément on en reconnait forcement n et c'est pour cela que les lignes qui possèdent plus de deux espaces sont reconnues aussi...

    J'avoue etre un peu perdu...

  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
    C'est juste parce que le point reconnait les espaces, donc la regex reconnait les lignes qui commencent par "* " puis n'importe quoi (y compris des espaces...). Il faut plutôt utiliser :
    autrement dit "* " puis n'importe quel caractère sauf un espace, puis n'importe quoi.

    --
    Jedaï

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 53
    Points : 23
    Points
    23
    Par défaut
    J'ai pas compris ton message Jedai.

    Ce que je veux c'est reconnaitre les lignes qui ont "*" puis exactement 2 espaces (pas plus pas moins).

  6. #6
    Membre habitué Avatar de minus
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 153
    Points : 177
    Points
    177
    Par défaut
    Ah oui le .* c'est pas bien **se colle une baffe**.
    J'avais pas pensé a ce cas la.


    @ecthelion
    En principe l'expression de Jedai devrait mieux marcher
    (les espaces sont de "vrais" espaces et pas \s qui prend en compte aussi les tabulations etc...)
    Science sans conscience n'est que ruine de l'â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
    Citation Envoyé par ecthelion
    J'ai pas compris ton message Jedai.

    Ce que je veux c'est reconnaitre les lignes qui ont "*" puis exactement 2 espaces (pas plus pas moins).
    Oui, c'est ça, il faut donc que tu reconnaisse "*" puis 2 espaces puis quelque chose qui n'est pas un espace, c'est ce que fait ma regex.
    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/perl
    use strict; use warnings;
    my $filename = "le chemin de ton fichier";
    open my($file), '<', $filename
      or die "I/O error $filename : $!\n";
     
    my $message = '';
    while( my $line = <$file> ){
      chomp($line);
      $message .= " $1" if ($line =~ m/^\*  ([^ ].*)/ );
    }
    print $message;

    --
    Jedaï

Discussions similaires

  1. [Débutant] Expression régulière simple
    Par Pfeffer dans le forum C#
    Réponses: 2
    Dernier message: 26/04/2013, 10h24
  2. [RegEx] Expression régulière simple
    Par cdpk.2010 dans le forum Langage
    Réponses: 2
    Dernier message: 23/12/2010, 01h37
  3. [RegEx] Expression régulière simple et preg_replace
    Par Tenmaxime dans le forum Langage
    Réponses: 2
    Dernier message: 07/06/2010, 15h10
  4. Expression régulière simple ou pas ?
    Par dollark1K dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 23/09/2008, 10h13
  5. Expression régulière simple
    Par NerOcrO dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 14/05/2007, 11h32

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