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 :

[VB.Net] Comment extraire un texte entre deux arguments ?


Sujet :

VB.NET

  1. #21
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Salut ,
    Je comprends plus rien, quand je vous ai demandé ce que vous entendez dire par chaine minimale vous avez repondu :

    Citation Envoyé par neguib
    Utilisée par exemple avec la chaine
    ...)(myValue = (myFunction(myParameter,myVar)* myConst))(...
    et les délimitateur "(" et ")", j'obtiens bien
    myValue = (myFunction(myParameter,myVar)* myConst)
    myFunction(myParameter,myVar)* myConst
    myParameter,myVar
    Mais votre solution retourne la derniere chaine à partir de gauche entre les delimtateurs, c'est bien ca ??

    A part ca le pattern à l'air (sans doute ) bien formulé

  2. #22
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par mehdi_tn
    Salut ,
    Je comprends plus rien, quand je vous ai demandé ce que vous entendez dire par chaine minimale vous avez repondu :



    Mais votre solution retourne la derniere chaine à partir de gauche entre les delimtateurs, c'est bien ca ??

    A part ca le pattern à l'air (sans doute ) bien formulé
    Oui suis_je bête je t'ai mis le resultat d'un autre test qui m'avait mis sur la voie des groupes imbriqués donc j'obtiens bien
    myParameter,myVar
    donc nous avons également la méthode qui retrouve tous les groupes imbriqués dont tu a vu le resultat anticipé et cela en une seule passe. En même temps toujours pas de différence significative en terme de performance. Pour ce qui est des groupes non imbriqués StormiOn a trouv le pattern pour retrouver les groupes minimaux mais nous planchons sur les groupes englobant qui reste encore introuveble via regexp. On s'accroche

  3. #23
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Citation Envoyé par neguib
    je t'ai mis le resultat d'un autre test qui m'avait mis sur la voie des groupes imbriqués
    Ah ok vous me rassurez

    Pour obtenir les groupes minimaux, j'ai utilisé ce pattern
    Biensure à remplacer "\(" par borne inf et "\)" par borne Sup

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     MatchCollection mc = Regex.Matches(InputString, @"\((?<mot>[^\)\(]*)\)");
                for (int i = 0; i < mc.Count; i++)
                {
                    Console.WriteLine(mc[i].Groups["mot"].Value);
                }
    PS: Je viens de verifier avant de poster et apparament c'est le meme pattern que vous utiliser avec moins de groupe et sans les .*

    Edit :
    Citation Envoyé par neguib
    mais nous planchons sur les groupes englobant qui reste encore introuveble via regexp
    Bon courage mais franchement je ne crois pas que c'est possible, parce que une fois que le RegExp a trouvé le premier groupe englobant, il le classe comme solution et ne l'utilise plus pour verifier s'il y a un groupe dedans, donc il faut trouver un moyen d'utiliser une recursivité avev la RegExp,

    J'ai trouvé un article qui parle de la recursivité des RegEcp en Perl , mais j'ai pas encore testé en Dot Net :

    Regexp Power

  4. #24
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Citation Envoyé par mehdi_tn
    Bon courage mais franchement je ne crois pas que c'est possible, parce que une fois que le RegExp a trouvé le premier groupe englobant, il le classe comme solution et ne l'utilise plus pour verifier s'il y a un groupe dedans
    C'est le problème en effet, je ne pense pas que les expressions régulières soient la solution si l'on souhaite obtenir tous les groupes, sans exceptions, se trouvant entre les délimiteurs. Pour les groupes "minimaux" voici la version finale

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    Sub Main()
        Dim results As String() = Test.ExtraireChaineMinCompiled("myValue = _
                myFunction(myParameter,myVar)*(myConst)", "(", ")")
    End Sub
     
    Public Class Test
        Public Shared Function ExtraireChaineMinCompiled( _
          ByVal chaine As String, ByVal borneDepart As String, _
          ByVal borneFin As String) As String()
            borneDepart = PreparerChaine(borneDepart)
            borneFin = PreparerChaine(borneFin)
     
            Dim pattern As New StringBuilder(borneDepart)
            pattern.Append("(?<output>[^")
            pattern.Append(borneDepart)
            pattern.Append(borneFin)
            pattern.Append("]*)")
            pattern.Append(borneFin)
            Dim matchColl As MatchCollection = _
      New Regex(pattern.ToString(), RegexOptions.Compiled And _
      RegexOptions.ExplicitCapture).Matches(chaine)
            If (matchColl.Count > 0) Then
                Dim tabString(matchColl.Count - 1) As String
                Dim i As Integer = 0
                While i < matchColl.Count
                    tabString(i) = matchColl(i).Groups("output").Value
                    i += 1
                End While
                Return tabString
            Else
                Return Nothing
            End If
        End Function
     
        Private Shared ReadOnly CaracteresSpecifiques() As Char = _
            {"("c, ")"c, "["c, "]"c, "."c, "^"c, "$"c, "*"c, "?"c, "+"c}
     
        Private Shared Function PreparerChaine(ByVal chaine As String) As _
        String
            If Array.IndexOf(CaracteresSpecifiques, CChar(chaine)) > -1 Then
                Dim sb As New StringBuilder("(\")
                sb.Append(chaine)
                sb.Append(")")
                Return sb.ToString()
            End If
            Return chaine
        End Function
    End Class

  5. #25
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    J'utilise les groupes parce que ca me permet d'obtenir exactement la chaine dont j'ai besoin, ca m'eviterais les differents Replace, mais bon chacun a son point de vue, l'essentiel est qu'on a compris les limites des RegExps

    Edit : Oops désolé je n'ai pas vu l'edit

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. vb.net comment récupérer du texte entre deux "\'"
    Par infodes dans le forum VB.NET
    Réponses: 3
    Dernier message: 29/10/2014, 12h11
  2. [RegEx] Comment récupérer le texte entre deux motifs ?
    Par whitespirit dans le forum Langage
    Réponses: 6
    Dernier message: 25/03/2010, 21h59
  3. Regexp: extraire du texte entre deux balises
    Par moook dans le forum Langage
    Réponses: 11
    Dernier message: 19/06/2007, 18h08
  4. [ADO.Net][VB.NET] Comment copier des données entre deux BDD différentes ?
    Par maddog2032 dans le forum Accès aux données
    Réponses: 6
    Dernier message: 06/06/2005, 11h01

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