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 :

Recherche les occurences de chaines multiple dans une autre chaine


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut Recherche les occurences de chaines multiple dans une autre chaine
    Bonjour,

    J'ai résolu le problème avec l'exemple ci-dessous. Mais j'aimerais votre avis pour savoir si c'est la bonne méthode avec une chaine à analyser très longue (100 000 caractères par exemple). Si les seuls occurences "toto" sont très nombreuse (exemple 10000) cela va prendre un bout bout de temps !

    Le but : rechercher la sous-chaine "toto......###" dans la chaine mère ou les 6 points peuvent être n'importe quel caractère. Comme cette fonction n'existe pas pour les chaines j'ai décomposer en deux phase : (1) rechercher si la chaine "toto" est présente (si oui on donne à index sa position) puis (2) vérifier si la chaine "###" est présente à l'index +10 ? Si oui OK. Donc ça sera une boucle dans une autre.

    Dans l'exemple ci-dessous cette occurence ne se produit que deux fois (index 0 et index 51).

    Ouvrir une form avec deux textbox en multilignes et un bouton pour visualiser le résultat.

    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
    32
    33
    34
    35
    36
    37
     
     
    Imports System.Text.RegularExpressions
     
    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     
            Dim text = "totoabcdef###totototoghitotojkl###mnopqrstuvwxyzabctotodefcde###ghijklm###"
     
            Dim rx = New Regex("toto", RegexOptions.IgnoreCase)
            Dim sx = New Regex("###", RegexOptions.IgnoreCase)
     
            Dim mc = rx.Matches(text)
            Dim sc = sx.Matches(text)
     
            Dim i, j, k As Integer
     
            'recherche chaque occurance de "toto"
            For Each m As Match In mc
                i += 1
                TextBox1.Text += Str(i) + "         " + Str(m.Index.ToString) + vbCrLf
     
                'recherche chaque occurance de "###"
                For Each s As Match In sc
                    j += 1
                    TextBox2.Text += Str(j) + "           " + Str(s.Index.ToString) + vbCrLf
     
                    'Vérifie si l'espace entre index "toto" et index "###" est bien égal à 10
                    If s.Index.ToString = m.Index.ToString + 10 Then
                        k += 1
                        TextBox2.Text += "Concordance trouvée numéro " + Str(k) + vbCrLf
                    End If
                Next
            Next
     
        End Sub
    End Class
    Merci pour vos suggestions.

    A+

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour Excalybur,

    Pour quoi ne tentes-tu pas de remplacer les deux recherches Regex par une seule dans laquelle le point est le joker pour n'importe quel caractère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            Dim rx = New Regex("toto......###", RegexOptions.IgnoreCase)
            ''''''''''' Dim sx = New Regex("###", RegexOptions.IgnoreCase)
    Tu devrais obtenir le résultat que tu veux, c-a-d les 2 seuls "toto......###", en une seule exécution du Regex.

    Ton code devrait devenir :

    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
     
    Imports System.Text.RegularExpressions
     
    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     
            Dim text = "totoabcdef###totototoghitotojkl###mnopqrstuvwxyzabctotodefcde###ghijklm###"
     
            Dim rx = New Regex("toto......###", RegexOptions.IgnoreCase)
     
            Dim mc = rx.Matches(text)
     
     
            Dim i As Integer
     
            'recherche chaque occurance de "toto"
            For Each m As Match In mc
                i += 1
                TextBox1.Text += Str(i) + "         " + Str(m.Index.ToString) + vbCrLf
     
           Next
     
        End Sub
    End Class


    ...

  3. #3
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Effectivement, je cherchais à comprendre pourquoi le point "." me posez un problème avec les Regex ! Il apparait en bleu sous 2022.

    Tu vient de me donner la réponse. C'est un joker.

    En fait c'est même plus subtil, car dans mon cas les "toto" sont en fait un triple point à rechercher c'est-à-dire "..."

    Du coup pour éviter un conflit inter Regex j'ai remplacé préventivement le triple point par un triple mélange improbable "§§§" pour rechercher la chaine ! Puis à la sorite opération inverse !

    Donc solution plus simple et plus rapide !

    Merci pour tes idées. Tout fonctionne.

    A+

  4. #4
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Merci pour le retour.
    Bon après-midi.
    ...

  5. #5
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    Par défaut
    Il faut savoir que lorsque la pattern commence par un chaîne littérale comme "toto" ou le caractère "Horizontal Ellipsis", avant même la marche "normale" du moteur de regex (position par position pour tester la pattern), une recherche avec un algorithme rapide de la partie littérale est effectuée pour déterminer les positions possibles où la pattern peut réussir (autrement dit les positions où cette partie littérale se trouve). Seules les positions identifiées par cette recherche préalable seront testées avec la pattern, ce qui accélère grandement le résultat.

  6. #6
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Merci CosmoKnacki pour tes explications.

    Pour ne pas mourir idiot as-tu un lien vers un bon tutoriel sur les Regex ?

    A+

  7. #7
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    Par défaut
    Le tutoriel de David Grellety est plutôt pas mal (ne te laisse pas impressionner par le début un peu théorique). Par contre ce qui manque c'est une explication pour bien comprendre le fonctionnement des quantificateurs et le backtracking (ce qui est indispensable), tu trouveras une description ici (en Anglais).

    La référence reste le livre Mastering Regular Expressions de J.-F. Friedl (notamment en ce qui concerne ce point). Certaines éditions se trouvent gratuitement sur le net en pdf, et si je me rappelle bien la première édition est également sortie en français.

    Pour tester les patterns spécifiques à .NET, il y a regexstorm.net et regex101.com.

  8. #8
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Bonjour

    Merci pour les tutoriels, l'anglais n'est pas un problème pour moi, les deux tutos sont bien complémentaires.

    J'entrevois d'énorme possibilité de travail sur la conversion de certains fichier. Avec un code bien plus light.

    Encore merci

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

Discussions similaires

  1. [LibreOffice][Tableur] rechercher les coordonnées d'un texte dans une colonne
    Par Mod77 dans le forum OpenOffice & LibreOffice
    Réponses: 4
    Dernier message: 30/06/2016, 10h33
  2. Réponses: 1
    Dernier message: 18/04/2016, 14h00
  3. Compter les occurences d'un mot dans une chaîne
    Par mimi2311 dans le forum Pascal
    Réponses: 4
    Dernier message: 20/04/2008, 22h37
  4. remplacer les occurences d'un caractere dans une chaine par un autre
    Par lity7 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 14/03/2008, 12h02
  5. Compter les occurences d'un car dans une chaine/variable
    Par sherlockfr dans le forum Windows
    Réponses: 2
    Dernier message: 10/11/2005, 07h48

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