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 - Comparer des champs avec des balises de séparation aléatoires


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Points : 30
    Points
    30
    Par défaut Regex - Comparer des champs avec des balises de séparation aléatoires
    Bonjour,

    Je cherche à comparer des champs répondant à plusieurs structurations possibles mais dont les balises de séparation sont plutôt aléatoires>>> ça c'est une phrase incompréhensible.

    Donc ex:
    J'aimerais pouvoir identifier et comparer ces 2 champs et les identifier comme identiques:

    "BlaBlaBlaBla_F4E_21_PRC_QA010_BlaBlaBlaBla" = "BliBloBLU-F4E-21 PRC_QA-010.BliBloBLU"


    et ceci pour plusieurs "modèles" de structuration; ex:
    "F4E_21_PRC_QA010" ; "ENG-72-MF-5P 0074-AL" ; "_DF6DS4D_"


    J'ai essayé d'écrire plein de trucs.... mais bof... ce bout de code est juste là pour voir ce que j'ai déjà fait mais il est surement "très mauvais" (c'est mon 3eme jour avec regex)
    En fait je voudrais que le résultat du regex enlève par la suite les balises qui ont servies à extraire mon/mes "modèles" d'une chaîne de caractères afin de pouvoir les comparer !!

    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
     
    Function RegexRecherche(Texte As String)
        Dim RegEx As RegExp
        Set RegEx = New RegExp
        Dim matches As IMatchCollection2
     
        Dim match As Variant
        With RegEx
            .IgnoreCase = False
            .Global = True 
     
            .Pattern = "(([A-Z]|[0-9]){3}[- _]([A-Z]|[0-9]){2,4}[- _]([A-Z]|[0-9]){2,3}[- _]([A-Z]|[0-9]){4,6}[- _]([A-Z]|[0-9]){2,4})"
            .Pattern = .Pattern & "|(([A-Z]|[0-9]){3}(?<=[- _])([A-Z]|[0-9]){2}[- _]([A-Z]|[0-9]){3}[- _]([A-Z]|[0-9]){2}[- _]?([A-Z]|[0-9]){3})" 'F4E_21_PRC_QA010 ou F4E_21_PRC_QA-010
            .Pattern = .Pattern & "|(([A-Z]|[0-9]){3}[- _]([A-Z]|[0-9]){1}[- _]([A-Z]|[0-9]){6})"
            .Pattern = .Pattern & "|(ITER)([-_ ])([A-Z]|[0-9]){1,3}([-_ ])([A-Z]|[0-9]){3,6}"
            .Pattern = .Pattern & "|(?![-_ ])([A-Z]|[0-9]){6,7}(?=[-_ .])" ' >>>>> PROBLEME
            .Pattern = .Pattern & "|(PCR[- _]?[0-9]{1,4}(?=[-_ ]))"
            .Pattern = .Pattern & "|(ENG[- _]?[0-9]{1,2}[- _]?[A-Z]{2}[- _]?([A-Z]|[0-9]){2}[ \S][0-9]{4}[- _]?[A-Z]{2}(?=[-_ .]))" '"ENG-72-MF-5P 0074-AL.xlsx"
            .Pattern = .Pattern & "|(IO-_[0-9]{2}_[A-Z]{2}-_([A-Z]|[0-9]){6})" ' IO-_21_CS-_3YJNQJ
     
        Set matches = .Execute(Texte)
     
        End With
     
        For Each match In matches     
           RegexRecherche = matches.Item(matches.Count - 1).Value
        Next
     
    End Function
    Ensuite j'appel ma fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         if RegexRecherche(Texte1) = RegexRecherche(Texte2) then blablabla...
    "F4E-21 PRC_QA-010" >>> oui cela rentre dans le modele "F4E[truc de séparation: -_ . etc]21[truc de séparation: -_ . etc]PRC[truc de séparation: -_ . etc]QA[truc de séparation: -_ . etc]010"


    Voilà.. j'espère que c'est clair !
    Merci bcp

  2. #2
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut




    Bonjour, bonsoir !

    Comme ici c'est le forum des formules de feuilles de calculs, voir tout simplement avec CHERCHE ou TROUVE

    Même si un code semble inutile, en VBA voir du côté de la fonction InStr ou encore la méthode Find
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Points : 30
    Points
    30
    Par défaut Ok...
    Je ne veux pas passer par les formules, car cela débouchera par la suite sur une macro qui scannera un dossier avec des noms de fichiers.

    Merci en tout cas pour la réorientation !
    J'attends de voir si il y a des fans de RegEx. Car c'est un peu difficile à digérer comme outil.

  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
    Le problème c'est qu'il est difficile de t'aider à trouver un motif général (qui t'aurais peut-être échappé) si tu ne fournis pas une grosse dizaine (ou vingtaine suivant l'hétérogénéité) d'exemples concrets (sans blibloblu) voire réel si c'est possible. L'important est de reproduire strictement les formats existants (taille, casse, mêmes caractères délimiteur).

    Si d'autre part tu peux fournir les règles de nomenclature (ou carrément la signification), cela peut aussi simplifier la tâche.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Points : 30
    Points
    30
    Par défaut
    En fait ce n'est pas la construction du motif qui me pose problème. C'est de pouvoir obtenir le résultat sans certains caractères de séparation:

    "L'important est de reproduire strictement les formats existants (taille, casse, mêmes caractères délimiteur)." >>> c'est là mon problème !


    Exemple
    ABC_123456_TOTO
    ABC-123456-TOTO


    [A-Z]{3}[-_][0-9]{6}[-_][A-Z]{4}
    Ce motif va bien m'extraire les 2 références mais je ne pourrai pas dire qu'elles ont identiques alors que oui !

    J'ai contourné le problème en faisant un replace de "-" et "_" par "". Mais ce n'est pas élégant et cela va quand même me bloquer, car pour d'autres ref cela sera par exemple "#" qui servira à créer mon motif.
    Je ne vais pas faire un replace de tous les dé-limitateurs possibles car dans certaines ref ces caractères ne sont pas forcement des dé-limitateurs !

    (AB#12_456#TOT Ici le _ n'est pas limitateur)


    J'aurais préféré trouver (si cela existe) une méthode regex qui me donne le résultat en supprimant certains motifs:

    [A-Z]{3}([-_]truc qui enlève le symbole précédent du résultat)[0-9]{6}([-_]truc qui enlève le symbole précédent du résultat)[A-Z]{4}


    Est ce plus clair ?
    Merci.

  6. #6
    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
    J'ai l'impression que tu n'as pas compris ma demande, je vais donc être plus direct: Peux tu poster 15 exemples réels?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Points : 30
    Points
    30
    Par défaut
    #1
    IO-_21_DRW_348YPJ_- V01.0.xlsx
    IO-_21#DRW-348YPJ_- V01.0.xlsx
    _348YPJ_
    21_IO-_21_DRW-348YPJ_2-.PDF
    PCR-M237 - 21_IO-_21_PCR_AGDF34_01.0.PDF


    #2
    PCR_9QYZMR
    PCR 9QYZMR
    _9QYZMR

    #3
    DST_9PUCKF

    #4
    ENG-40-GL-SO0401-AL
    ENG-40-GL-SO0401-AL_
    ENG_40-GL-SO0401-AL
    ENG_40-GL-SO 0401-AL
    ENG-72-MF-13 0019-AL - V01.0.xlsx
    ~$ENG-72-MF-11 0139-AL - V00.2.xlsx
    Reply_ENG_06_RF_110244_AL_01.0_Signed.pdf
    eng_40_dw_610066_es_v03_0.pdf


    #5
    ITAR_D_2F9EBK
    ITAR D_2F9EBK
    _2F9EBK_
    PCR-M158_supporting_document__14-L1_CW_g_2F9EBK_v1_0.pdf
    PCR-M158_supporting_document__TP_doors_r_2F9EBK_v1_0.pdf

    #6
    6315-CL-LR-0300 Crane Spec v01.pdf

    #7
    SDR 94PCR390 SIC rooms in Diagnostic Bldg jm.xlsx

    #8
    A17 - MF 11-0105 v01.0 - PCR309_B14_B2-B1-L1-L2-L3-L4-L5.3dxml


    #9
    IO-_21_IS-_2X3FZD_04.0.pdf
    IO-_21_IS_2X3FZD_04.0.pdf

    #10
    ITAR_LI_131203_RFI_DN29_NOM-09012014_BLR-14012014.xlsx


    etc....
    j'ai environ 4 fichiers de 1600 lignes chacun !!
    Mon but étant d’étoffer mes motifs au fur et a mesure que j'identifie des ref non taguées (et en évitant les faux positifs !!)

    C'est pour cela que je chercher un moyen d'identifier un motif séparé par certains caractères, et qu'une fois identifié le résultat soit donné sans ces caractères de séparation!
    Ex:
    IO-_21_DRW_348YPJ_- V01.0.xlsx >> motif [0-9]{2}[-_ #]{1,2}[A-Z]{3}[-_ ]([A-Z]|[0-9]){6}_ >> Résultat "21DRW348YPJ"
    IO- 21#DRW-348YPJ_- V01.0.xlsx >> motif [0-9]{2}[-_ #]{1,2}[A-Z]{3}[-_ ]([A-Z]|[0-9]){6}_ >> Résultat "21DRW348YPJ"


    J'ai vu des truc REGEX "Assertion avant positive" negative, arriere..etc mais je ne sais pas si cela peut répondre à mon besoin et comment cela marche. Je n'ai pas trouvé bcp d'exemples a ce sujet.
    Est ce que ces Assertions peuvent être mis ou on veut ? autant de fois que l'on veut dans un même motif ?

    Voila,
    Merci.

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/01/2016, 21h01
  2. Réponses: 3
    Dernier message: 10/02/2012, 11h40
  3. Requête INSERT INTO avec des champs et des variables
    Par fips1962 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 26/05/2009, 17h51
  4. Recharger des champs avec des cookies
    Par mitch46000 dans le forum Langage
    Réponses: 3
    Dernier message: 11/08/2007, 08h33
  5. petit souci avec des variables avec des fonctions psql
    Par dust62 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/04/2005, 13h45

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