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

Macros et VBA Excel Discussion :

[RegEx] Parser Chemin flexible [XL-365]


Sujet :

Macros et VBA Excel

  1. #1
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 538
    Points
    8 538
    Par défaut [RegEx] Parser Chemin flexible
    Bonjour à tous

    Je ne suis pas familier avec les RegEx, je les ai déjà utilisées quelques fois et j'ai toujours réussi à me dépatouiller mais là... Je tourne en rond

    Je souhaite valider et découper un chemin cible vers un serveur ftp. Les formes qui doivent être accepté sont les suivantes:
    1. /aFFAIRE/prepa_trx/TestAlice/Mon fichier.csv
    2. prepa_trx/TestAlice/Mon fichier.csv
    3. /AFFAIRE/prepa_trx/TestAlice/
    4. /prepa_trx/TestAlice/Mon fichier.csv
    5. /AFFAIRE/prepa_trx/TestAlice


    J'ai créé l'expression suivante (du moins c'est cells qui semble le plus proche de ce que je souhaite réaliser)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^(\/AFFAIRE\/)?\/?((?:(?:[a-z0-9_\-^!#$%&+={}.\\[\]\ ])+\/|$)*)((?:[a-z0-9_\-^!#$%&+={}.\ ])+(?:\.[a-z0-9]{2,4}$))?|$ (avec igm; j'ai mis le m pour faire mes tests, je le retire en "prod")
    En terme de validité, je cherche à avoir
    1. "/AFFAIRE/" si présent
    2. (/)prepa_trx/TestAlice(/) le chemin
    3. Mon Fichier.csv ... le nom du fichier


    Je valide les 3 premières lignes, partiellement la 4ème (le / du début n'est pas retenu mais ça ne me dérange pas, c'est même mieux).
    Par contre la 5ème forme me résiste, si je rends facultatif le / dans le second groupe, il considère le nom de fichier comme faisant partie du chemin.

    Si quelqu'un pouvez me filer un coup de main, ce serait sympa

    Je vous souhaite une bonne soirée

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2002
    Messages
    833
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 833
    Points : 1 317
    Points
    1 317
    Par défaut
    Salut, teste ceci: "^(\/AFFAIRE\/)?((?:[^\/]+\/)*)([^\/]+\.[a-z0-9]{2,4})?$|^(\/)?((?:[^\/]+\/)*[^\/]+\/?)$"

  3. #3
    Membre habitué
    Homme Profil pro
    libre
    Inscrit en
    Mai 2024
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Mai 2024
    Messages : 101
    Points : 176
    Points
    176
    Par défaut
    Jette un coup d'œil
    le modèle capte uniquement les noms que tu cites dans votre exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^((\/AFFAIRE\/)|\/?)prepa_trx\/TestAlice(\/Mon fichier.csv|\/?)

  4. #4
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 538
    Points
    8 538
    Par défaut
    Salut
    Citation Envoyé par Franc Voir le message
    Salut, teste ceci: "^(\/AFFAIRE\/)?((?:[^\/]+\/)*)([^\/]+\.[a-z0-9]{2,4})?$|^(\/)?((?:[^\/]+\/)*[^\/]+\/?)$"
    J'utilise le site RegEx101 pour tester mes expression.
    Quand je teste l'expression que tu proposes, je n'arrive pas à valider les chaines 4 et 5


    Citation Envoyé par Volid Voir le message
    Jette un coup d'œil
    le modèle capte uniquement les noms que tu cites dans votre exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^((\/AFFAIRE\/)|\/?)prepa_trx\/TestAlice(\/Mon fichier.csv|\/?)
    J'ai oublié de préciser que prepa_trx/TestAlice/Mon Fichier.csv était un contenu variable . j pourrait avoir prepa_trx/Super/SonDocument.xlsx

    Je vous remercie pour le temps que vous m'accordez.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  5. #5
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 007
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 007
    Points : 9 401
    Points
    9 401
    Par défaut
    Hello,
    Citation Envoyé par Qwazerty Voir le message
    Je souhaite valider et découper un chemin cible vers un serveur ftp. Les formes qui doivent être accepté sont les suivantes:
    1. /aFFAIRE/prepa_trx/TestAlice/Mon fichier.csv
    2. prepa_trx/TestAlice/Mon fichier.csv
    3. /AFFAIRE/prepa_trx/TestAlice/
    4. /prepa_trx/TestAlice/Mon fichier.csv
    5. /AFFAIRE/prepa_trx/TestAlice
    je n'ai pas trop bien compris ce que tu cherches exactement à faire ?
    Veux - tu :
    1 - voir si il y a AFFAIRE (en ignorant la casse ou pas ?) dans la chaîne et suivant si il est là ou pas faire les autres actions (ex en 1 OK, en 2 Non OK) ?
    2 - Récupérer le chemin suivant AFFAIRE ou avec AFFAIRE dedans (ex: /AFFAIRE/prepa_trx/TestAlice en 3)?
    3 - Récuper le nom du fichier csv si il y a en un (ex Mon fichier.csv en 2)?

    Pourquoi n'utilises-tu pas un Split ( par exemple on peut utiliser le dernier élément du Split pour savoir si il y a un .csv) ?

    Peux-tu montrer le code que tu utilises ?

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  6. #6
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 538
    Points
    8 538
    Par défaut
    Salut

    L'utilisation de Split, left, right,... est une possibilité mais vu que j'ai plusieurs possibilités de structure du chemin (avec des / qui peuvent être manquant en début et fin de chemin), je préférerai rester sur une regex. D'autant que celle que j'ai produite est presque ok (je sais qu'il peut-y avoir un monde entre presque et ok).
    Le code en lui-même n'a pas d'importance, je saurais l'adapter sans RegEx si besoin.

    J'ai inclus l'indicateur "i" pour la rendre insensible à la casse

    Je souhaite récupérer 3 blocs
    1. Mon chemin doit comporter /AFFAIRE/, s'il est omis (bloc vide), je le rajouterais systématiquement après dans mon code.
    2. Le chemin d'accès "sec", sans Affaire ni nom de fichier. Ce chemin est de forme variable.
    3. Le nom du fichier


    Voilà ce que ça donne dans Regex101
    Nom : 2024-06-24_07h34_59.png
Affichages : 45
Taille : 43,3 Ko

    [Edit]
    J'ai modifié mon expression en supprimant le "." des caractère pouvant être présent dans l'arborescence (partie chemin) comme ça il reconnait bien tous les cas, la seul "contrainte" est de ne pas mettre de "." dans le nom des repertoires, pour mon utilisation actuelle, ça me va.
    Ca donne ça
    ^(\/AFFAIRE\/)?(\/?(?:[^\\\/\:\*\?"\<\>\.]+(?:\/|$))+)((?:[^\\\/\:\*\?"\<\>]+)(?:\.\w{1,4})$)?
    Je laisse encore un peu en non résolu pour voir si quelqu'un pourrait me trouver une meilleur solution.
    [/Edit]

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  7. #7
    Membre régulier
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 52
    Points : 86
    Points
    86
    Par défaut re
    Bonjour à tous
    @Qwazerty j'ai du mal à comprendre ta logique

    cela dit un essai avec split et restitution sur 3 items
    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
    22
    Sub test()
        Dim t
        For I = 1 To 5
            t = BlocTreeChaine(Range("A" & I).Text)
            texte = "test " & I & vbCrLf
            For A = 1 To 3
                texte = texte & A & "° " & t(A) & vbCrLf
            Next
            MsgBox texte
        Next
    End Sub
     
    Function BlocTreeChaine(txt)
        Dim bloc(1 To 3), t, I&
        t = Split(txt, "/")
        bloc(3) = t(UBound(t))
        For I = UBound(t) - 1 To 0 Step -1
            If LCase(t(I)) <> "affaire" Then bloc(2) = t(I) & "/" & bloc(2) Else bloc(1) = t(I)
        Next
        'If bloc(1) = "" Then bloc(1) = "AFFAIRE(ajouté)"'on ajoute le segment "Affaire"
        BlocTreeChaine = bloc
    End Function

  8. #8
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 538
    Points
    8 538
    Par défaut
    Salut

    Merci pour le temps passé mais comme je l'ai dit plus haut, le faire en VBA n'est pas le soucis, je peux faire un code qui fait ce que je souhaite
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
     
    Sub testPath()
    Const aPath As String = "/Affaire/Rep1/Rep2/mon fichier.ext"
     
     
    Dim strPath As String
    Dim vSplit As Variant
    Dim strNomF As String
     
     
        strPath = aPath
        'On supprime affaire si existant en début de chaine
        If StrComp(Left(strPath, 9), "/affaire/", vbTextCompare) = 0 Then strPath = Mid(strPath, 10)
        'On supprime un / en début de chaine si existant
        If Left(strPath, 1) = "/" Then strPath = Mid(strPath, 2)
        'On split le text
        vSplit = Split(strPath, "/")
     
        If IsArray(vSplit) Then
            'On regarde si le dernier terme contient un nom de fichier
            strNomF = vSplit(UBound(vSplit))
            If InStr(1, strNomF, ".") > 0 Then strPath = Left(strPath, Len(strPath) - Len(strNomF))
        End If
     
        'On reconstitue un chemin fiable
        strPath = "/AFFAIRE/" & strPath
        If Right(strPath, 1) <> "/" Then strPath = strPath & "/"
     
     
    End Sub
    Je trouve juste plus performant/élégant/sûr de le faire avec une expression régulière. Pourquoi réinventer la roue alors des des outil existe, c'est un peu ça le fond de ma demande.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  9. #9
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 007
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 007
    Points : 9 401
    Points
    9 401
    Par défaut
    Citation Envoyé par Qwazerty Voir le message
    Je trouve juste plus performant/élégant/sûr de le faire avec une expression régulière. Pourquoi réinventer la roue alors des des outil existe, c'est un peu ça le fond de ma demande.
    Ben parfois l'expression régulière n'est pas ce qu'il faut. Quand on commence à arriver à une expression régulière complexe, il faut se poser la question. Une expression régulière complexe est parfois difficile à comprendre et ce n'est pas forcément plus sûr et au point de vue performance, normalement cela va être plus lent qu'un Split car en VBA cela utilise un Objet COM.

    Dans ton cas de figure, il me semble que le Split sera plus facile à utiliser et plus simple à rectifier si il y a un problème.
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

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

Discussions similaires

  1. [RegEx] Regex / Parser le sommaire de mediawiki
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 24/07/2018, 11h58
  2. Regex et chemin de fichier
    Par jroman dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 16/06/2011, 11h32
  3. Réponses: 3
    Dernier message: 04/06/2009, 19h17
  4. Parser une requête HTTP/GET en c ! regex ?
    Par canard75 dans le forum C
    Réponses: 14
    Dernier message: 06/12/2005, 10h08
  5. Réponses: 9
    Dernier message: 30/11/2005, 18h18

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