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

Windows Forms Discussion :

Regex avec operateur non gourmand et repetition d'un motif


Sujet :

Windows Forms

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 156
    Points : 306
    Points
    306
    Par défaut Regex avec operateur non gourmand et repetition d'un motif
    Bonjour,
    Je suis en VB2008 express, et j'ai une difficulté avec une expression régulière.

    Ma chaine de départ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (1193258686)[Wed Oct 24 22:44:46 2007] \aPC -1 Zenne:Zenne\/a says to the guild,"\aITEM 2122690531 540794519:Poignées rapides flamboyantes\/a\aITEM 379234030 -889112265:Pierre d'Ayr lacérante flamboyante\/a\aITEM -914484718 1393661558:Poignée vampirique flamboyante\/a"
    Je cherche a isoler dans un premier temps le chiffre entre parenthèse (timestamp), puis les deux nombres entiers "2122690531" et "540794519", et enfin la chaine de caractères jusqu'a la fermeture de la balise "\/a".

    Mon premier jet de regex est le suivant :
    R
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    egex = New Regex("^\((\d+)\).+aITEM ([+-]?\d+) ([+-]?\d+):(.+)\\/a")
    C'est pas mauvais, mais ce satané opérateur est trop gourmand, et je me retrouve avec en chaine de caractères pour le 4eme argument toute la fin de la chaine a partir du 1er "Poignées...".
    J'ai d'abord chercher a limiter mon dernier operateur, ce qui n'est pas evident. Mais en fait, j'ai surtout un Timestamp, puis un nombre n d'une expression "\aITEM.....\/a". Du coup, je bloque sur la regex et le moyen de l'exploiter pour retrouver mes petits en VB.
    Actuellement je fais un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    M = ItemRegex.Match(sLine)
    If M.Success Then
        sTemp = M.Groups(1).Value & ";" & M.Groups(2).Value & ";" & M.Groups(3).Value & ";" & M.Groups(4).Value
    ....
    Toute aide est la bienvenue

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2008
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    essayes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    egex = New Regex("^\((\d+)\).+(//aITEM ([+-]?\d+) ([+-]?\d+):(.+)\\/a)+")

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 156
    Points : 306
    Points
    306
    Par défaut
    Si simple
    Ok, je m'attaque maintenant a la manière de récupérer les groupes de résultat en VB. Merci.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 156
    Points : 306
    Points
    306
    Par défaut
    Hum non en fait, ça ne marche toujours pas, l'opérateur étant toujours aussi gourmand. J'ai l'impression que le ? pour le rendre non-gourmand ne marche pas très bien.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Regex("^\((\d+)\).+(\\aITEM ([+-]?\d+) ([+-]?\d+):(.+)\\/a)+?")
    Malgré le ?, l'operateur + est toujours gourmand.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2008
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Bon, on décortique : J'encadre les expr par ' pour indiquer les espaces en début ou fin de regexp
    Un commentaire est en dessous du code

    pour début de ligne

    pour la parenthèse ouvrante

    pour le premier nombre comme on veux le récupérer on l'entoure de parenthèses

    pour la parenthèse fermante

    pour la chaîne de caractères '[Wed Oct 24 22:44:46 2007] \aPC -1 Zenne:Zenne\/a says to the guild,"'


    ensuite on trouve une répétition comme celle-ci :
    '\aITEM 2122690531 540794519oignées rapides flamboyantes\/a'
    ce qui donne :

    pour la barre oblique inversée

    pour cette même chaîne de caractères

    pour un nombre pouvant être éventuellement négatif (dans ton exemple, on ne vois qu'un éventuel '-'. S'il y a possibilité de voir apparaitre un '+', je pense que l'expression serait '(\+|\-)?')

    pour l'espace séparant tes 2 nombres

    pour un second nombre pouvant être éventuellement négatif

    pour ce même caractère

    pour ce qui semble être un libellé (Nb si tu souhaites récupérer cette chaîne, entoure la regexp de parenthèses)

    pour une barre oblique inversée

    pour la chaîne de caractère qui marque la fin de la répétition


    ce qui va nous donner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '(\\aITEM (-?\d+) (-?\d+):.+\\/a)+'
    le '+' de fin pour signaler que l'expr peut être répétée.


    On termine par
    il y a un '"' que je n'avait pas vu et le $ pour fin de ligne

    au final, ça devrait donner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '^\((\d+)\).+(\\aITEM (-?\d+) (-?\d+):.+\\/a)+"$'

  6. #6
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Citation Envoyé par joel88
    pour la chaîne de caractères '[Wed Oct 24 22:44:46 2007] \aPC -1 Zenne:Zenne\/a says to the guild,"'
    Sauf que par défaut on prend le plus de caractères possibles. .+ ne va donc pas se limiter à ca. Il va prendre
    [Wed Oct 24 22:44:46 2007] \aPC -1 Zenne:Zenne\/a says to the guild,"\aITEM 2122690531 540794519:Poignées rapides flamboyantes\/a\aITEM 379234030 -889112265:Pierre d'Ayr lacérante flamboyante\/a
    qui est bien suivi ensuite par
    \aITEM -914484718 1393661558:Poignée vampirique flamboyante\/a
    ce qui correspond au reste de l'expression. Même remarque pour le .+ qui doit récupérer le libellé.

    Quelque chose comme ceci devrait aller mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^(\(\d+\)).+"(?:\\aITEM ([+-]?\d+) ([+-]?\d+):(.+?)\\/a)+"$
    Pour limiter le backtracking on peut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^(\(\d+\))[^"]+"(?:\\aITEM ([+-]?\d+) ([+-]?\d+):([^\\]+)\\/a)+"$
    si le libellé ne peut pas contenir de \
    Pas de questions techniques par MP

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2008
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Désolé de te contredire StormimOn, j'ai trouvé un petit outil VB6 permettant de vérifier une expression régulière.

    L'expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^\((\d+)\).+\\aITEM (-?\d+) (-?\d+):(.+)\\/a\\aITEM (-?\d+) (-?\d+):(.+)\\/a\\aITEM (-?\d+) (-?\d+):(.+)\\/a+"$
    fonctionne parfaitement.

    J'ai du répéter 3 fois la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \\aITEM (-?\d+) (-?\d+):(.+)\\/a
    l'outil ne gérant pas l'imbrication de parenthèses.

    J'ai parenthésé le '.+' correspondant au libellé ci-dessus afin de le récupérer

    Dommage que cet outil soit en VB6 et qu'il ne gère pas l'imbrication de parenthèses.

    Je vais rechercher s'il en existe un en VB.NET

    Cordialement,
    Joël

  8. #8
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Citation Envoyé par joel88
    J'ai du répéter 3 fois la partie l'outil ne gérant pas l'imbrication de parenthèses.
    Tu masques le problème de la répétition à ce moment, normal que cela fonctionne.

    Utilise Expresso. C'est un designer d'expressions régulières gratuit et très pratique.

    Avec la chaine d'entrée
    (1193258686)[Wed Oct 24 22:44:46 2007] \aPC -1 Zenne:Zenne\/a says to the guild,"\aITEM 2122690531 540794519:Poignées rapides flamboyantes\/a\aITEM 379234030 -889112265:Pierre d'Ayr lacérante flamboyante\/a\aITEM -914484718 1393661558:Poignée vampirique flamboyante\/a"
    L'expression
    ^(\(\d+\))[^"]+"(?:\\aITEM ([+-]?\d+) ([+-]?\d+):([^\\]+)\\/a)+"$
    fonctionne bien.

    Par contre
    ^\((\d+)\).+(\\aITEM ([+-]?\d+) ([+-]?\d+):(.+)\\/a)+"$
    renvoie seulement les informations du dernier texte.
    Pas de questions techniques par MP

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 156
    Points : 306
    Points
    306
    Par défaut
    Je ne connaissais que http://www.regextester.com/ comme testeur de regex, mais il ne gère pas tout. Expresso a l'air très bon !

    La regex de StormimOn est impeccable, et isole bien séparément les différents groupes que je recherche.
    Problème résolu grâce a vous.

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

Discussions similaires

  1. Code : Probleme avec Oui/Non
    Par mat75019 dans le forum Access
    Réponses: 6
    Dernier message: 24/04/2006, 13h36
  2. [WinForms] ComboBox avec valeur non désirée
    Par Ditch dans le forum Général Dotnet
    Réponses: 14
    Dernier message: 11/04/2006, 16h52
  3. Problème de mutex avec Waitforsingleobject non-bloquant
    Par rvzip64 dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 03/11/2005, 11h02
  4. Fichier texte avec codage non standard
    Par giloutho dans le forum Langage
    Réponses: 4
    Dernier message: 15/07/2005, 19h31
  5. Problème de Regex ... avec un point
    Par bugalood dans le forum Langage
    Réponses: 2
    Dernier message: 29/05/2005, 10h26

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