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

Langages de programmation Discussion :

Regex obtenir le nombre d'occurence dans le resultat


Sujet :

Langages de programmation

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2009
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 194
    Points : 102
    Points
    102
    Par défaut Regex obtenir le nombre d'occurence dans le resultat
    Bonjour, je poste ici car ma question concerne mes regex en general et non un langage en particulier.

    Est il possible de retourner dans une expression reguliere, le nombre d'occurence de l'expression plutot que le resultat de l'expression.

    Exemple :

    abc11

    regexp : [0-9]

    je voudrais qu'il me retourne 2 (le nombre d'occurence) plutot que 1 et 1, le resultat.

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    eh bien ça ne veut pas dire grand chose, les regexp servent à matcher des patterns et pas à afficher quoique ce soit ou à compter, en revanche il existe souvent dans les différents langages qui permettent de les utiliser des façons de compter le nombre d'occurrences d'un pattern, ça oui

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2009
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 194
    Points : 102
    Points
    102
    Par défaut
    Oui bien sur, les langages permetent de remonter l'info, compter les occurences, etc.

    Mais ce que je voudrais savoir ( et ma connaissance en regex est vraiment très faible) c'est si il est possible, en lieu et place de retourner le(s) "match", de retourner le nombre de "match".

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    à moins d'un regex-hack (comprendre un truc pas prévu pour mais qu'en le triturant bien on trouve quand même moyen de le faire) non.

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 121
    Points
    28 121
    Par défaut
    Pour répondre simplement, non, ce que tu veux faire n'est pas possible, mais c'est réponse est néanmoins fausse.


    Citation Envoyé par delta07 Voir le message
    si il est possible, en lieu et place de retourner le(s) "match", de retourner le nombre de "match".
    Une regex ne retourne absolument rien, elle permet de définir une expression, rien de plus.

    Dans ton exemple "abc11", l'expression régulière [0-9] ne correspond pas. Une des expressions régulière qui correspond est, par exemple, [a-z]{3}[0-9]{2} (c'est à dire trois lettres minuscules puis deux chiffres).

    Si tu veux une expression régulière qui te permette de trouver s'il y a des chiffres dans une expression, il te faut chercher "tout sauf les chiffres", répété au moins une fois. Ça pourrait donner (sauf erreur) ([^0-9]*[0-9]+)+ : (tout sauf les chiffres, suivi d'au moins un chiffre), au moins une fois.

    Après, ce que tu fais du résultat, c'est ton soucis, ou celui de ton langage.

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 888
    Points : 6 629
    Points
    6 629
    Par défaut
    Effectivement non, un moteur de regex ne sait faire qu'une seule chose: trouver des motifs dans une chaîne. Il n'a pas vocation à faire des calculs ne serait ce qu'un simple compteur et ce n'est pas son rôle. Ce rôle revient éventuellement aux fonctions qui l'utilisent.

    D'autre part la notion de "regex en général" n'existe pas, de même que la "pattern portable", c'est juste une vieille croyance répandue. Les patterns sont intrinsèquement liées aux moteurs qui vont les utiliser, que ce soit par les outils dont elles disposent, par leurs syntaxes, par la manière dont elles sont construites et vont être traitées (Une même pattern peut donner un résultat différent avec deux moteurs). Pour faire le grand écart, tu pourrais comparer par exemple les patterns utilisées par l'outil sed en mode POSIX BRE (Basic Regular Expression) avec les patterns plus sophistiquées des moteurs de Perl ou de .net.

    Pour ce qui est d'une éventuelle ruse pour compter quand même, autre qu'une fonction native d'un langage renvoyant directement le nombre d'occurrences, il n'y a pas de solution 100% pur porc qui ne mettrait en jeu que la machine bête et méchante qui cherche ses tokens dans sa chaîne:

    Le moteur de Perl permet d'exécuter dynamiquement du code du code au sein même d'une pattern avec la syntaxe (?{ code }). Ça reste donc extrêmement lié au langage. Et de toute manière, si c'est juste pour compter des occurrences, il y a plus simple.

    De même le moteur PCRE peut effectuer un appel de fonction en cours de pattern (le callout) avec la syntaxe (?Cn) ou n est un entier (0-255) associé à la fonction en question. Cette possibilité n'est pas implémentée en PHP, R ou dans les éditeurs comme notepad++ ou sublimetext, mais elle est disponible dans autoHotKey, QuickMacro et est utilisée à des fins de débogage par l'outil pcretest.

    Une solution consiste à intervenir auparavant sur la chaîne cible en lui ajoutant artificiellement un compteur prêt à l'emploi (évidemment ça ne sert à rien, mais on peut le faire). On ajoute une ligne à la fin de la chaîne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    abc11
    #1#2#3#4#5#6#7#8#9#10#11#12#13#14#15#...
    Puis on utilise une pattern (PCRE/PERL ici mais elle doit pouvoir s'adapter bon an mal an pour Java) du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?:[^0-9]*[0-9](?=(?:.*\R)++(?|(?>#[0-9]+)*?#\1#([0-9]+)|#(1)#)))+(?s).*\K\1|0
    Ici j'ai utilisé une ligne-compteur imaginaire et infinie, mais avec un peu d'astuce, il est peut être possible d'utiliser juste les dix chiffres et de le faire compter en base 10.

    (Le groupe non-capturant est répété à chaque chiffre. À l'intérieur du lookahead, pour la première occurrence on va capturer le chiffre 1 dans la "ligne compteur", puis pour les occurrences suivantes on prend le nombre qui suit la capture précédente \1.)

    On peut aussi faire quelque chose du même goût avec le système de pile du moteur .net:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?<stk>[^0-9]*[0-9](?=.*\n))+(?>(?:.*\n)*)(?>#(?<-stk>(?<result>[0-9]+)))*

  7. #7
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    (Le groupe non-capturant est répété à chaque chiffre. À l'intérieur du lookahead, pour la première occurrence on va capturer le chiffre 1 dans la "ligne compteur", puis pour les occurrences suivantes on prend le nombre qui suit la capture précédente \1.)
    c'est à ce genre de hack consistant à traiter le moteur regex comme une machine à états que je faisais référence plus haut, gg (qui plus est je connaissais pas du tout les callouts PCRE)

  8. #8
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 888
    Points : 6 629
    Points
    6 629
    Par défaut
    Merci, j'ai d'ailleurs revu ma copie à propos des implémentations des callouts après quelques recherches.

Discussions similaires

  1. Nombre d'occurences dans une chaîne de caractères
    Par Olivier14 dans le forum Langage
    Réponses: 4
    Dernier message: 20/03/2006, 19h11
  2. [AS] Nombre d'occurences dans une string
    Par frol dans le forum Flash
    Réponses: 3
    Dernier message: 26/12/2005, 15h13
  3. Obtenir le nombre de lignes dans un RecordSet
    Par LapinGarou dans le forum MFC
    Réponses: 3
    Dernier message: 25/10/2005, 15h51
  4. Réponses: 28
    Dernier message: 22/09/2005, 11h57
  5. recherche du nombre d'occurences dans une table
    Par berry dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/01/2004, 20h03

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