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 :

trouver le dernier : expressions régulière


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Par défaut trouver le dernier : expressions régulière
    bonjour
    j'ai un fichier svg ou je voudrais rendre le dernier point invisible en changeant la classe css
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <!-- datapoint shown -->
            <circle cx="369.95" cy="400" r="2.5" class="dataPoint2"/>
     
                                  <!-- datapoint shown -->
            <circle cx="370.9" cy="400" r="2.5" class="dataPoint2"/>
     
                                  <!-- datapoint shown -->
            <circle cx="371.85" cy="400" r="2.5" class="dataPoint2"/>
     
                                  <!-- datapoint shown -->
            <circle cx="372.8" cy="400" r="2.5" class="dataPoint2"/>
    # et apres autre chose
    il faut donc que je trouve le dernier class="dataPoint2" et le remplace par class="invisible". Il faut savoir que toute les retours lignes sont supprimés au moment du traitement.
    Si vous avez ça, dans vos cartons.

  2. #2
    Membre chevronné
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Par défaut
    Salut vidici,

    Si tes retours à la ligne sont supprimés, ou si tu utilises le modificateur //s pour traiter l'information comme si elle était sur une seule ligne, il te suffit de matcher class="dataPoint2" précédé du quantificateur .*, qui va opérer de façon "gourmande", pour atterrir sur 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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    my $st = q(<!-- datapoint shown -->
            <circle cx="369.95" cy="400" r="2.5" class="dataPoint2"/>
     
                                  <!-- datapoint shown -->
            <circle cx="370.9" cy="400" r="2.5" class="dataPoint2"/>
     
                                  <!-- datapoint shown -->
            <circle cx="371.85" cy="400" r="2.5" class="dataPoint2"/>                                                                                                                                                  
     
                                  <!-- datapoint shown -->
            <circle cx="372.8" cy="400" r="2.5" class="dataPoint2"/>
    # et apres autre chose);
     
     
    if ($st =~ /^(.*class=")(dataPoint2)(".*$)/s) {
        print "$1invisible$3";
    } else {
        print 'Erreur : les données ne contiennent ' .
        'aucun class="dataPoint2"\n';
    }
    Eks

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Par défaut
    merci Eks
    en fait j'avais pas vu que tu m'avais donné une solution toute faite dans le bas du déroulant. Mais j'ai suivis la piste de ton intro et j'en suis arrivé à cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     my ($captureE)= $gif =~ /(.+)*r="2.5" class="dataPoint1"/;
            my ($captureF)= $gif =~ /.*r="2.5" class="dataPoint1"(.+)/;
            $gif = $captureE.'r="0" class="dataPoint1"'.$captureF;
    je voulais te remercier pour ça quand j'ai vu ta solution... scrogneu gneu j'aurais gagné du temps.

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par vidici Voir le message
    scrogneu gneu j'aurais gagné du temps.
    Bah, tu as sans doute appris quelque chose en le faisant toi-même.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Bah, tu as sans doute appris quelque chose en le faisant toi-même.
    certes ... par contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($captureE)= $gif =~ /(.+)*r="2.5" class="dataPoint1"/;
    bien que ne faisant pas échouer le programme, et bien que fournissant le resultat attendu, me donne cette erreur
    Complex regular subexpression recursion limit (32766) exceeded at CreateLineGraph.pm
    Je viens de m'en rendre compte.

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    C'est un warning, pas une erreur. Tu peux sans doute le réduire au silence avec le pragma suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    use warnings;
    no warnings qw/regexp/;
    mais je n'ai pas essayé.

    Cela dit, ce warning indique que peut-être ton expression utilise le moteur d'expression régulière de façon un peu inefficace, ou du moins suboptimale (sur une chaîne trop longue). Si c'est juste un fois, ça n'a sans doute pas trop d'importance, mais si tu le fais de très nombreuses fois dans ton programme, il faut peut-être envisager une solution différente: soit un mini-parser, soit une utilisation des fonctions rindex et substr, soit une expression régulière un peu plus subtile empêchant de trop nombreux retours arrière (backtracking) du moteur de regex.

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

Discussions similaires

  1. Trouver la bonne expression régulière
    Par Marvelll dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 09/04/2010, 08h13
  2. [REGEX] trouver le max à l'aide d'une expression régulière
    Par miketidy dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 20/06/2008, 15h17
  3. Expression régulière : Trouver exactement un mot
    Par Drannor dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 09/05/2008, 15h42
  4. [RegEx] Expression régulière pour trouver des mots
    Par cbroissa dans le forum Langage
    Réponses: 7
    Dernier message: 26/05/2006, 23h39

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