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

VB.NET Discussion :

Petit soucis de Regex


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2006
    Messages : 130
    Par défaut Petit soucis de Regex
    Bonsoir,

    Je tente de faire un Regex, je ne dois pas être loin, mais à chaque fois il me manque une chose.

    Je le test sur le site regexstorm ça passe dans certains cas mais pas tous.
    un petit coup de main serait le bienvenue et aussi une explication sur ce qui me manque pour y arriver la prochaine fois ;-)

    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    dim pattern as string = "^(?<EpNum>\d+)((\.((?<alpha>[a-i])|(?<num>[1-9])))?|(_)?)*"

    Les différents cas :
    01
    01_02
    02.1_02.2
    03.a_03.b
    04_05_06.1_06.2_07.a_07.b_08


    explication :
    le chiffre est EpNum
    le point permet de définir une partie (suivi d'un caractère alphabetique de a à i, ou d'un numerique de 1 à 9)
    le séparateur principal des élément est le underscore.

    le tout peu être mixer, je veux valider la chaine et récupérer les différents éléments.

    Ca semble simple comme ça, j'ai essayé de détailler comme ça lors de la construction du regex, mais il doit me manquer quelque chose.


    Merci de votre aide.

  2. #2
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Construire une expression rationnelle dépend en partie de ce qu'on compte faire avec les résultats, s'il suffit juste de valider un motif
    pas besoin de capture de groupe ou autre du coup ceci aurait pu suffire "^(\d+(?:\.[a-i1-9])?)(?:_(?1))*$" sauf que a priori les pattern récursif en .Net ça veut pas.

    Après tu captures des groupes donc j'imagine que c'est pour les exploiter, du coup on s'en fiche de matcher le tout.
    Comme tu dis que l'underscore sert de séparateur c'est donc que tu veux utiliser les "trucs" entre ces séparateurs donc autant ne matcher que ça (en utilisant Regex.Matches).
    Ça simplifie le job on peut utiliser ainsi "(?<EpNum>\d+)(?:\.(?<part>[a-i1-9]))?" comme pattern.

    Là on voit que j'ai nommé "part" la lettre ou chiffre potentiellement en plus.
    Si tu veux les distinguer comme tu l'as fait on peut le faire ainsi "(?<EpNum>\d+)(?:\.(?:(?<alpha>[a-i])|(?<num>[1-9])))?" faudra ensuite tester dans le code si tel ou tel groupe a une valeur ou pas.


    Pour le détail ; faudrait demander ce qui n'est pas compris, je mets de côté la toute première vu qu'elle est pas possible en .Net (a priori).
    Pour le reste je pense pas qu'il y ait trop de complications au vu de celle que tu avais tentée.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2006
    Messages : 130
    Par défaut
    Merci de ta réponse expliqué.

    En fait hier, j'y étais, j'ai rajouté le underscore et la capture.

    J'explique ma démarche :

    J'avais tester sur un match direct tout mes exemples passés.

    En fait dans mon projet, j'ai une phase de contrôle sur un ensemble de fichier qui doit répondre à plusieurs conditions, depuis l'organisation des répertoires au nommage du fichier en lui même
    exemple :

    Saint Seiya\S01\Saint Seiya - 1x01 - titre.mkv

    J'ai donc des contrôles :
    - ...
    - Le nom du répertoire de la saison commence bien par S avec des chiffres
    - si le 1er répertoire débute bien le nom du fichier
    - le séparateur
    - si la saison en numérique suit
    - le séparateur saison/episode
    - et l'analyse de l'épisode(s) / partie (Donc ici le regex)

    puis la récupération des informations par le groupe se fait dans une 2ème phase de contrôle pour répartir les fichiers dans des classes (saison, épisodes... donc potentiellement plusieurs fois le même fichier dans des instances d'épisode)


    c'est donc au moment que j'avais vu le match fonctionner que j'avais voulu tenter la capture comme tu le disais pour l'exploiter et que j'ai vu des tests plus ou moins fonctionner

    la détection du contenu du groupe, je n'avais pas de soucis.

    Je vais tester à tête reposé

    Merci.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2006
    Messages : 130
    Par défaut
    Citation Envoyé par Sehnsucht Voir le message
    Construire une expression rationnelle dépend en partie de ce qu'on compte faire avec les résultats, s'il suffit juste de valider un motif
    pas besoin de capture de groupe ou autre du coup ceci aurait pu suffire "^(\d+(?:\.[a-i1-9])?)(?:_(?1))*$" sauf que a priori les pattern récursif en .Net ça veut pas.

    Après tu captures des groupes donc j'imagine que c'est pour les exploiter, du coup on s'en fiche de matcher le tout.
    Comme tu dis que l'underscore sert de séparateur c'est donc que tu veux utiliser les "trucs" entre ces séparateurs donc autant ne matcher que ça (en utilisant Regex.Matches).
    Ça simplifie le job on peut utiliser ainsi "(?<EpNum>\d+)(?:\.(?<part>[a-i1-9]))?" comme pattern.

    Là on voit que j'ai nommé "part" la lettre ou chiffre potentiellement en plus.
    Si tu veux les distinguer comme tu l'as fait on peut le faire ainsi "(?<EpNum>\d+)(?:\.(?:(?<alpha>[a-i])|(?<num>[1-9])))?" faudra ensuite tester dans le code si tel ou tel groupe a une valeur ou pas.


    Pour le détail ; faudrait demander ce qui n'est pas compris, je mets de côté la toute première vu qu'elle est pas possible en .Net (a priori).
    Pour le reste je pense pas qu'il y ait trop de complications au vu de celle que tu avais tentée.

    Comme je le disais, j'ai 2 passes, l'une de contrôle globale, (en gros, j'ai une méthode Controle qui appel certaines sous méthodes de contrôle en fonction du type de média selon comment celui ci doit être nommé) ce qui me permet de lister les fichiers déjà incorrectement nommé, puis j'ai par la suite une passe de répartition des objets en décorticant comme ici Episode, pour les ranger dans chaque objet parent.

    J'ai vu qu'il n'était pas possible d'utiliser la 1ère expression à cause de la récursivité.
    Du coup je ne vois pas le moyen de contrôler (lors de cette 1ère passe) si ce n'est pas moi même d'imbriquer des méthodes qui s'appellent entre elle, pour verifier chaque cas... je trouve ça un peu "limite" il doit y avoir un moyen de ne pas faire d'usine à gaz...


    ===

    Je viens de réussir avec le pattern suivant pour le contrôle :
    "^((\d+(?:\.[a-i1-9])?)(?:_)?)*$"

    sur ces 2 chaines :
    "04_05_06.1_06.2_07.a_07.b_08"
    "04_05_06.1_06.2_07.a_07.b_08 - toto"

    La 1ère : succes en IsMatch, la seconde normal elle ne passe pas.

    par contre j'ai un soucis avec celle-ci :
    "04_05_06.1_06.2_07.a_07.b_08_"

    je n'arrive pas à lui dire que cela ne doit pas finir par underscore ou autre chose, ça doit forcément au final finir par 1 chiffre ou une lettre de a à i exemple :
    04.1_04.2
    05.a_05.b

    du coup je n'ai pas vu l'heure... je vais tout de même manger...

  5. #5
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    En .Net faire "(?1)" ne fonctionne pas ; cette construction dit juste en gros "répète le pattern du groupe 1".
    Par conséquent, il suffit juste de le faire "manuellement" en fait soit utiliser "^\d+(?:\.[a-i1-9])?(?:_\d+(?:\.[a-i1-9])?)*$" ça allonge un peu le motif c'est tout.

    Avec ça tu peux faire une première passe où tu valides avec IsMatch la chaine complète (et elle fonctionne sur tous les cas que tu as posté)
    et après utiliser l'autre (avec EpNum via Matches) pour extraire tes éléments.

    Je suis pas certain qu'il y ait moyen de faire le tout (validation + extraction) en une seule passe avec les expressions rationnelles uniquement ; pour ça faudrait faire un parser plutôt.

Discussions similaires

  1. [REGEX] petit soucis ..
    Par florent dans le forum Général Python
    Réponses: 5
    Dernier message: 20/01/2013, 09h17
  2. Réponses: 11
    Dernier message: 07/04/2010, 17h51
  3. [RegEx] Petit soucis de regex
    Par viewtifulced dans le forum Langage
    Réponses: 2
    Dernier message: 25/03/2010, 12h05
  4. [RegEx] petit soucis regex (syntaxe)
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 13/06/2009, 15h28
  5. Petit souci AWK et REGEX
    Par DIE dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 19/12/2007, 22h09

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