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

Boost C++ Discussion :

aide sur une regex


Sujet :

Boost C++

  1. #1
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut aide sur une regex
    Bonjour,
    N'etant pas du tout familier avec les regex, je cherche le moyen de savoir si un objet string contient à la fin de la chaine une suite de chiffres de 1 ä 40000 suivi d'un caractere _ et suivi d'un chiffre 0 ou 1.
    J'ai regardé au niveau de boost mais je suis un peux perdu quant à l'ecriture de la regex.
    quelqu'un peut il me donner un petit coup de main la dessus?

    Merci d'avance,
    Rien ne se perd, rien ne se crée, tout se transforme

    ------- -------

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Il y a deux aspects dans ta question :
    - À quoi doit ressembler ma regex,
    - À quoi va ressembler mon code en C++ qui exécute la regex.

    Pour le premier, je ne peux que te conseiller d'aller vers un site comme regex101 qui te permettra de prototyper ta regex par essais/erreurs successifs.
    Pour le second, il faudrait préciser un peu ce qu tu comptes en faire. Si tout ce que tu veux c'est savoir si la chaîne correspond, sans rien deander d'autre, regex_match est fait pour toi.

    (ps : Plus besoin de passer par boost pour les regex si tu as un compilo pas trop vieux : C'est désormais dans le standard C++)
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    c'est pas vraiment (du tout) lié au C++ ?
    Au feeling, je dirais .*?([1-3]?[0-9]{3}|4000)_[01]$.
    Après faut tatoner.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    C'est jamais très pratique d'avoir à vérifier un rang numérique au sein d'une regex car on se retrouve coincé entre deux alternatives qui ont chacune leurs défauts.

    La première consiste à vérifier le format avec une pattern sans tenir compte du rang numérique (ou peu) et de capturer la sous-chaîne de chiffres pour vérifier le rang par une autre voie (en faisant un transtypage de la sous-chaîne en int, puis une comparaison). L'avantage de cette méthode est qu'elle est relativement simple, l'inconvénient est de devoir sortir de la logique regex et d'ajouter une étape supplémentaire (mais ça ne doit quasiment pas impacter les performances). Une pattern de ce type doit faire l'affaire:(?<![0-9])([1-9][0-9]{0,4})_[01]\z (ou pour ECMAScript ou POSIX étendue (^|[^0-9])([1-9][0-9]{0,4})_[01]$, attention au décalage de numéro du groupe de capture).

    L'autre méthode consiste à traduire le rang numérique en pattern, chose qui est particulièrement malaisée mais néanmoins possible. Pour rendre cette sous-pattern la plus efficace possible en réduisant au maximum le travail du moteur de regex, l'idée est de veiller à ce que le moteur suive le chemin le plus court possible. Exemple:
    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
     
        [1-3][0-9]{0,4} # 30000 + 3000 + 300 + 30 + 3 = 33333
      |
        [5-9][0-9]{0,3} # 5000 + 500 + 50 + 5 = 5555
      |
        4 # 1112
        (?:
            [1-9][0-9]{0,2}
          |
            0
            (?:
                [1-9][0-9]?
              |
                0
                (?:
                    [1-9]
                  |
                    0{0,2}
                )
            )?
        )
    Cette sous-pattern bien que longue est conçue de telle manière qu'une fois le moteur engagé dans une branche, on peut être sûr que la correspondance ne peut pas être dans une autre branche. De plus les trois branches principales (nombres commençant par [1-3], [5-9] ou 4) sont classées par ordre de probabilité (il en va de même pour les branches inférieures).
    Au final, cette sous-pattern se trouve être plus efficace qu'une expression plus factorisée. Son seul défaut est la présence de nombreux groupes qui peuvent représenter un très léger coût, mais cela ne concerne que les 1112 nombres commençant par 4 (au regard des 38888 autres, ça fait peu).

    Donc on aboutit, une fois compactée et complétée, à l'expression suivante utilisable avec regex_search:


    NB: En ce qui concerne la version perl de la pattern, il est possible de bénéficier d'une optimisation supplémentaire en utilisant la technique de discrimination du premier caractère. En effet, tel qu'elle est actuellement, le moteur va devoir tester les trois branches inutilement sur tous les caractères qui ne sont pas des chiffres si ceux-ci ne sont pas précédés d'un chiffre (à cause du lookbehind). Mais, avant même le démarrage de la marche normal du moteur, il est possible de lui faire tester la pattern uniquement sur les chiffres de la chaîne en ajoutant un lookahead au début, c'est à dire (?=[1-9]). Cet ajout permet une "pré-optimisation" qui mettra en œuvre un algorithme de recherche rapide pour déterminer les points de départ possibles de la pattern dans la chaîne. Cette étape de pré-optimisation se devant d'être très rapide, elle ne peut pas être déduite de l'analyse des trois branches, par contre l'ajout du lookahead va le permettre. Le bénéfice de cette technique se fera ressentir d'autant plus si la chaîne est longue et qu'elle contient peu de chiffres.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. [RegEx] Besoin d'aide sur une regex
    Par kairi084 dans le forum Langage
    Réponses: 13
    Dernier message: 13/02/2014, 11h52
  2. Besoin d'aide sur une regex
    Par El_touristo dans le forum Langage
    Réponses: 3
    Dernier message: 19/11/2010, 18h32
  3. Aide sur une Regex en C# SVP
    Par leoncapri dans le forum C#
    Réponses: 4
    Dernier message: 19/09/2010, 19h01
  4. aide sur une regex
    Par danathane dans le forum Langage
    Réponses: 2
    Dernier message: 03/08/2010, 15h36
  5. [Regex C#] Aide sur une regex qui recupere des controles
    Par kerjon dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 14/05/2009, 14h10

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