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 :

Regexp de suppression d'espaces en début de ligne


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 9
    Points : 9
    Points
    9
    Par défaut Regexp de suppression d'espaces en début de ligne
    Salut à tous,

    J'ai un petit souci avec une expression régulière. Je fais un test avec le petit programme suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/perl -w
    use strict;
     
    my $text = " hey bonjour\n         \t          pof pif";
     
    print "$text\n";
    $text =~ s/^[ \t]+//g;
    print "$text\n";
    Normalement, je voudrais que le deuxième print devrait m'afficher
    Au lieu de ça, le remplacement semble ne fonctionner que sur la première ligne ?! Ça me donne donc :


    J'ai testé ce bout de code sous windows avec cygwin et sur une debian, le résultat est le même.

    Je ne comprends pas du tout ce comportement, je dis bien : «supprime moi (s) tout espace ou tabulation ([ \t]+) en début de ligne (^) et ce pour toutes les occurrences (/g).». Non ?

    Quelqu'un voit pourquoi ça marchouille pas pour toutes les lignes et surtout quelle serait la solution à ce fichu problème ?

    Merki
    @++

  2. #2
    Invité
    Invité(e)
    Par défaut
    Ici, tu n'a qu'une seule "ligne" dans $text
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my $text = " hey bonjour\n         \t          pof pif";
    si on pouvait mettre les marqueurs ^ et $ dans les chaine te ferait :
    [fixed]^ hey bonjour\n \t pof pif$[/fixed]
    donc, tu n'a que les espaces de debuts qui sont supprimés...

    donc, pour faire ce que tu veux, on pourrait proceder de cette maniere :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $text =~ s/^[ \t]+(.*?\n)[ \t]+(.*?\n?)/$1$2/g;
    mais ca nemarhce pas très bien...
    il vaudrait mieux faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @array = split /\n/, $text;
    for (@array) {
        s/^[ \t]+//;
    }
    $text = join "\n", @array;
    ATTENTION : code non testé...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Si tu as raison... Je trouve que c'est un comportement de Perl, comment dire, stupide ?!?

    ^ désigne l'endroit après un \n justement ?
    Je ne saisis pas la nuance là, je crois...

    ^ désigne un début de ligne, pourquoi diantre Perl ne prend il pas le texte qui suit un \n comme un début de ligne ???

  4. #4
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par batmatm
    Si tu as raison... Je trouve que c'est un comportement de Perl, comment dire, stupide ?!?

    ^ désigne l'endroit après un \n justement ?
    Je ne saisis pas la nuance là, je crois...

    ^ désigne un début de ligne, pourquoi diantre Perl ne prend il pas le texte qui suit un \n comme un début de ligne ???
    Non, c'est un comportement logique, et qui est tout à fait justifié dans la doc perlre (man perlre, ou perldoc perlre).

    Dans ton cas, il faut juste préciser à perl que la recherche de ^ est multiligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $text =~ s/^[ \t]+//mg;
    Il faut juste utiliser le bon contexte (paramètre) de recherche en fonction de ce que l'on vise et de ce que l'on sait de la qualité des données.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    OK, c'est bon ça marche.

    Donc en résumé, si on met g tout seul, le ^ est compris comme le début d'une chaîne. Si on met mg, c'est le début d'une ligne, donc tout caractère suivant \n sera pris comme ^.

    Merci

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

Discussions similaires

  1. [Shell] Suppression d'espace en début et fin de colonne
    Par nemo89 dans le forum Shell et commandes GNU
    Réponses: 15
    Dernier message: 29/05/2013, 12h44
  2. Réponses: 6
    Dernier message: 18/11/2010, 14h47
  3. Fichier txt/Import espace de début de ligne
    Par procyom dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 03/06/2008, 10h23
  4. [Débutant] Ajouter deux espaces en début de ligne d'un fichier txt
    Par niepoc dans le forum MATLAB
    Réponses: 19
    Dernier message: 30/04/2008, 16h40

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