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 : toutes les occurrences


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Points : 21
    Points
    21
    Par défaut regexp : toutes les occurrences
    quel modificateur de regexp je dois utiliser pour que la ligne suivante affiche 2 :
    perl -e ' @a_ = "aaa" =~ /aa/g; print scalar @a_, "\n";'

    Je veux que la recherche se poursuive 1 caractère après la première occurrence et pas après le dernier caractère de la première occurrence.

    Merci,

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Tu veux donc compter le nombre de fois que tu retrouves 2 a, et si il y en a un nombre impaire, compter le dernier a seul comme une occurence?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/local/bin/perl
     
    use strict;
    use warnings;
     
    my $val = "aaaaaaa";
    my $scal = () = ($val =~ /a{2}|a/g); 
    print "$scal\n";
    En utilisant un 'ou', si tu ne trouves pas 2 a successifs, tu regardes si tu en retrouves 1 tout seul.
    -- Jasmine --

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Points : 21
    Points
    21
    Par défaut
    Tu n'y es pas du tout, mais merci d'essayer

    Voici un autre exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    my $str = "aaaa";
    while( $str =~ /aa/g )
    {
    	my $pos = pos( $str );
    	print "$pos\n";
    }
    Il écrit 2 et 4. En modifiant je ne sais quoi dans la regexp, je veux obtenir 2,3,4 car on a 'aa' se terminant en position 2,3 et 4.

    Je viens de voir qu'en rajoutant la ligne pos($str) = $pos-1; après le print, j'obtiens le comportement que je veux.

    Mais n'y a-t-il pas moyen d'avoir ce comportement en modifiant uniquement la regexp ?

  4. #4
    Membre éclairé
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Points : 835
    Points
    835
    Par défaut
    je ne crois pas qu'il y ait de solution miracle.
    Le 1er truc qui me vient la comme ca, ca serait de rechercher la position de ta 1ere chaine avec index, en spécifiant une position a partir de laquelle commencer a chercher cette chaine. Puis quand tu trouves, tu changes cette position avec l'index trouvé + 1, et tu incremente ton compteur.

    Z.

  5. #5
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    J'ai trouvé une solution utilisant les apports de Perl 5.10 en matière de regex, en l'occurrence le verbe *FAIL.

    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;
    use warnings;
     
    my $target = "aaaababaa"; # la phrase cible
     
    my @matches; # le tableau qui recevra les positions.
     
    $target=~m/
       aa   # le motif recherché
       (?{push @matches, pos()}) # s'il est trouvé, on met la postion courante dans @matches
       (*FAIL) # on force l'échec de la reconnaissance, qui reprend à la position de départ +1
    /x;
     
    print "$_\n" foreach @matches; # affichage du résultat : oooh, exactement ce qu'on voulait !
    Avec la phrase cible que j'ai choisie, "aaaababaa", on obtient pour résultats 2, 3, 4 et 9, ce qui me semble conforme à ce que tu voulais.

    À noter que pour remplacer dans la regex le littéral aa par une variable à interpoler, il faudrait ajouter le pragma use re 'eval', qui peut poser des problèmes de sécurité si l'on n'y prend garde.
    There's nothing like $HOME!

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Points : 21
    Points
    21
    Par défaut
    Effectivement c'est le résultat que j'attends, merci.

    Je reste quand même déçu car j'étais persuadé que de base, les regexp cherchaient toutes les solutions.

    Je marquerai le sujet 'Résolu' si personne d'autre n'a mieux d'ici ce soir.

    Merci à vous de vous être penché sur la question.

  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 dev_KooK Voir le message
    Je reste quand même déçu car j'étais persuadé que de base, les regexp cherchaient toutes les solutions.
    Elles cherchent toutes les solutions qui ne se recouvrent pas, par défaut c'est bien plus utile que ce que tu veux... Et il est facile d'obtenir ce que tu veux avec une petite affectation à pos() après chaque occurrence.

    De plus si on transpose à la substitution, la sémantique que tu proposes est ambiguë
    --
    Jedaï

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

Discussions similaires

  1. Remplacer toutes les occurrences d'une sous-chaîne
    Par haypo dans le forum Télécharger
    Réponses: 2
    Dernier message: 15/06/2016, 20h17
  2. Réponses: 5
    Dernier message: 26/11/2011, 13h09
  3. Réponses: 4
    Dernier message: 07/07/2010, 09h33
  4. [Planning]Colorer toutes les occurrences d'un nom, en JS
    Par jean1190 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 02/06/2009, 09h32
  5. supprimer toutes les occurrences d'une chaine dans une autre
    Par identifiant_bidon dans le forum Langage
    Réponses: 3
    Dernier message: 21/11/2007, 10h36

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