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 :

Récupération d'"arguments" dans une chaine


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Novembre 2006
    Messages : 131
    Par défaut Récupération d'"arguments" dans une chaine
    Bonjour,

    Je souhaiterai écrire une fonction permettant de récupérer mes arguments dans une chaine... Je ne pense pas que le terme argument soit exact, mais je m'explique :

    A partir d'une chaine comme celle ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim maChaine As String = "Bonjour {Prénom} {Nom}"
    Je voudrais une fonction qui me permette de me retourner une table de String qui contient les valeurs "Prénom" et "Nom".
    Quelle est la piste a suivre pour réaliser de façon propre ce genre de recherche dans le texte?
    NB : Il me faut une façon optimisée de le faire car on s'entent que je vais travailler avec des chaines de caracteres beaucoup plus longues que celle donnée en exemple

    Merci d'avance

  2. #2
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut CHAINES DE CARACTERES A ANALYSER,token,mot cles
    bonjour,tu veux retrouver "avaler' la chaine mots par mot et retrouver les mots cles.
    StringSplit(chaineAnalyse,strSeparateur)
    strSeparateur c'est un espace dans ton exemple.
    elle renvoie un tableau de chaine sans les espaces.
    on peut ecrire egalement StringSplit(chaineAnalyse)
    elle renvoie un tableau de chaine non-vides(separ="")

    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
    38
    39
    40
     
    Public Function OuvrirFichier() As String
            Dim MonFichier As String = ""
            Dim MonOpenDlg As New OpenFileDialog
            MonOpenDlg.Title = "Ouverture Fichier Donnes LCARAT"
            Dim btnOK As DialogResult = DialogResult.OK
     
            MonOpenDlg.Filter = "Fichiers Donnes Texte(*.dat)|*.dat"
            MonOpenDlg.FilterIndex = 1
            If MonOpenDlg.ShowDialog = btnOK Then
                MonFichier = MonOpenDlg.FileName
            Else
                btnOK = DialogResult.Cancel
            End If
            Return MonFichier
        End Function
     
        Public Function ChaineVersTableau(ByVal LitChaine As String) As String()
            Dim TableLigne() As String
            TableLigne = Split(LitChaine," ")
            Dim DernierNonVide As Integer = -1
            Dim posCarIndesirable as String=")"
            For I As Integer = 0 To TableLigne.Length - 1
                 If TableLigne(I) <> "" Then
                      posCarIndesirable= Instr(1,TableLigne(I),")") 
                      If    posCarIndesirable<>0   Then 
                           Strings.Replace(TableLigne(I), ")", "", 1)
                       End If 
                      posCarIndesirable= Instr(1,TableLigne(I),"[") 
                       If  posCarIndesirable<>0 Then
                            Strings.Replace(TableLigne(I), ")", "", 1)
                        End if
                    Endif
                    DernierNonVide += 1
                    TableLigne(DernierNonVide) = TableLigne(I)
                End If
            Next
            ReDim Preserve TableLigne(DernierNonVide)
            Return TableLigne
        End Function
    Il y a moins d'optimiser ce code et factorisation en mettant par exemple la recherche des caracteres non-admis dans chaque tableligne() dans une fonction à part munie d'un tableau de ces caracteres non-admis(dictionary).
    Cette fonction fait :
    -a chaque appel avec un mot tableligne transmis (mot recupere par string.split)
    -Boucler sur le tableau des caracteres non-admis remplis ad-hoc:
    -executer instr et si il y a occurence d'un caractere non-admis
    -executer strings.replace
    -iterer
    -renvoyer a la fin un mot tableligne() nettoye a la fonction strings.split
    qui elle continuera son travail normalement.
    L'autre facon de voir ce probleme en sens inverse c'est un analyseur lexical qui travaille avec tous les mots admis stockes dans un dictionary et qui reconnait les mots cles admis et les stocke dans tableligne() et ignore les mots non-cles(c'est aussi l'approche pour un dico orthographique parbleu,mais avec la saise du robert ou larousse,caramba....).
    A boire et a manger ,c'est un vrai moulin ,tout depend du probleme pose..
    bon code ...........

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    C'est quoi le but final ? C'est un système de template, non ? Tu vas formater ça en remplaçant "{Prénom}" et "{Nom}" par les valeurs correspondantes ?

    Il y a une classe StringTemplate qui fait ça dans la librairie Dvp.NET:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim maChaine As String = "Bonjour {Prénom} {Nom}"
    Dim template As New StringTemplate(maChaine)
    Dim chuckNorris = New With { .Prénom = "Chuck", .Nom = "Norris" }
    Dim result As String = template.Format(chuckNorris)
    Il y a d'autres exemples (en C#, mais ça s'adapte facilement en VB) sur le wiki du projet

  4. #4
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Novembre 2006
    Messages : 131
    Par défaut
    Merci de vos éléments de réponse.

    Malheureusement ceci ne répond pas entièrement a mon besoin. Mais c'est ma faute, il y a des choses que je n'ai pas ou mal expliqués.
    - On travaille sur le Framework 2.0 donc les types anonymes n'existe pas
    - Impossible d'ajouter une nouvelle librairie dans ce projet sans qu'elle est été validée par l'entreprise (et vu que dvp.net est une béta...)
    - Mon besoin n'est pas de remplacer une chaine par une autre pour le moment. Ce dont j'ai besoin c'est de retrouver toutes les chaines correspondant a un motif (ou pattern) donné dans une chaine.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim maChaine As String = "Bonjour [Prénom] [Nom]. Vous avez [age]."
    Dans cet exemple, je voudrais pouvoir retrouver dans cette chaine toutes les valeurs comprises entre "[" et "]" ("Prénom", "Nom" et "age" dans ce cas)

    Merci de votre participation

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par jowsuket Voir le message
    - On travaille sur le Framework 2.0 donc les types anonymes n'existe pas
    Tu n'es pas obligé d'utiliser un type anonyme... J'ai fait comme ça dans mon exemple parce que c'était plus simple, mais ça marche aussi avec un type normal.

    Citation Envoyé par jowsuket Voir le message
    - Impossible d'ajouter une nouvelle librairie dans ce projet sans qu'elle est été validée par l'entreprise (et vu que dvp.net est une béta...)
    Pas grave, tu peux copier le code, et éventuellement le traduire en VB.NET si tu veux

    Citation Envoyé par jowsuket Voir le message
    - Mon besoin n'est pas de remplacer une chaine par une autre pour le moment. Ce dont j'ai besoin c'est de retrouver toutes les chaines correspondant a un motif (ou pattern) donné dans une chaine.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim maChaine As String = "Bonjour [Prénom] [Nom]. Vous avez [age]."
    Dans cet exemple, je voudrais pouvoir retrouver dans cette chaine toutes les valeurs comprises entre "[" et "]" ("Prénom", "Nom" et "age" dans ce cas)
    Dans la classe StringTemplate je fais ça avec une expression régulière + quelques traitements supplémentaires. C'est un peu complexe parce que le pattern que je cherche à repérer est en fait celui des placeholders utilisés par String.Format (genre "{0}"), mais il faut gérer le cas où les accolades sont doublées (séquence d'échappement pour pouvoir vraiment écrire une accolade). Tu peux toujours regarder comment c'est fait, si ça t'inspire...

    Sinon, vu que ton cas est plus simple, ça devrait pas être trop compliqué à gérer avec seulement une expression régulière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Dim r As New Regex("\[(\w+)\]")
        Dim results As MatchCollection = r.Matches(texte)
        For Each m As Match In results
            Console.WriteLine(m.Groups(1).Value)
        Next
    Groups(0) est la totalité de la chaine capturée
    Groups(1) représente le premier groupe de capture (expression entre parenthèses) capturé

  6. #6
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut pattern chaine texte,regex
    bonjour,
    Regarde cet outil gratuit "regxd" de Chris Sellers un gourou de chez microsoft qui permets d'entrer un expression reguliere et de la tester en interactif avec le pattern chaine sur ce lien
    http://www.sellsbrothers.com/tools/regexd.zip
    bon code....

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

Discussions similaires

  1. [MySQL] Double quote dans une chaine
    Par Beniti dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 21/02/2009, 14h57
  2. Ajout d'une quote (') dans une chaine de caractère
    Par moutu91 dans le forum Débuter
    Réponses: 2
    Dernier message: 19/01/2009, 11h58
  3. Inserer le double quote dans une chaine de requete
    Par schwinny dans le forum VBA Access
    Réponses: 14
    Dernier message: 04/03/2008, 15h00

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