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 :

Extraire une chaine via Expression Régulières ?


Sujet :

VB.NET

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 55
    Points : 45
    Points
    45
    Par défaut Extraire une chaine via Expression Régulières ?
    Salut..

    J'ai un problème avec les expressions régulières. En fait pas vraiment mais seulement sur le vb.net.

    Voilà la situation :
    J'ai un fichier sous forme
    <TITLE>
    This is a title
    </TITLE>

    <SUBTITLE>
    This is the 1st subtitle
    </SUBTITLE>

    <TEXT>
    This is some text for the 1st paragraph......
    </TEXT>

    <SUBTITLE>
    This is the 2nd subtitle
    </SUBTITLE>

    <TEXT>
    This is some text for the 2nd paragraph......
    </TEXT>
    et je veux extraire ce qui est entre les balises <xxx> et </xxx> alors j'ai écris mon motif comme
    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
            pat = "<(.*)>(\n*)(.*?)(\n*)</(.*)>"
            content = "le texte du fichier..."
     
            Dim r As New Regex(pat, RegexOptions.Multiline And RegexOptions.IgnoreCase)
            Dim mc As MatchCollection = r.Matches(content)
     
            Dim c As Capture
            Dim cc As CaptureCollection
     
            For Each m As Match In mc
                cc = m.Captures
                For Each c In cc
                    s &= "capture = [" & c.Value & "]" & vbCr
                    Me.resultat.AppendText(s & "   ****  " & vbCr)
                Next
            Next
    mais ça m'affiche
    [<TITLE>
    This is a title
    </TITLE>]
    ****
    [<TITLE>
    This is a title
    </TITLE>]
    [<SUBTITLE>
    This is the 1st subtitle
    </SUBTITLE>]
    ****
    [<TITLE>
    This is a title
    </TITLE>]
    [<SUBTITLE>
    This is the 1st subtitle
    </SUBTITLE>]
    [<TEXT>
    This is some text for the 1st paragraph......
    </TEXT>]
    ****
    ......
    Il m'affiche le [1er match] puis le [1er match + 2eme match] puis le [1er match + 2eme match + 3eme match]...... je ne comprend pas ces résultats.

    comment pourrait je extraire les chaines qui sont entre les <xxx> et </xxx>

  2. #2
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 55
    Points : 45
    Points
    45
    Par défaut
    Après quelques testes j'ai réussi a manipuler mon fichier comme je le souhaite.

    Bon voilà mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            pat = "(?<1>\<\w+\>)\s+(?<2>.*)\s+(?<3>\</\w+\>)"
            Dim r As New Regex(pat)
            Dim m As Match = r.Match(conteu_du_fichier)
     
            While m.Success
     
                Me.resultat.AppendText(m.Groups(2).Value & vbCr & "  ****" & vbCr)
                m = m.NextMatch
            End While
    Le m.groups(0) c'est le résultat du masque (pat) complet sur le texte.
    Le m.groups(1) c'est <TITLE> et <SUBTITLE> et <TEXT>
    Le m.groups(2) c'est le texte entre m.groups(1) et m.groups(3)
    Le m.groups(3) c'est </TITLE> et </SUBTITLE> et </TEXT>

  3. #3
    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
    Tu peux simplifier avec l'expression
    Il faut utiliser l'option SingleLine dans ce cas pour que le . puisse correspondre aux retours chariots.

    Le groupe 1 contiendra TITLE, SUBTITLE, TEXT
    Le groupe 2 contiendra le texte entre les balises. Un petit coup Trim pour retirer les caractères non voulus (CR, LF) et le tour est joué.

    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim matches As MatchCollection = Regex.Matches(input, "<([^>]+)>(.*?)</\1>", RegexOptions.Singleline)
    For Each match As Match In matches
        Dim texte As String = match.Groups(2).Value.Trim(Environment.NewLine.ToCharArray())
        Console.WriteLine(texte)
    Next
    avec input le texte contenu dans ton fichier.

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 55
    Points : 45
    Points
    45
    Par défaut
    Merci StormimOn ça marche.

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

Discussions similaires

  1. [RegExp] comparaison début d'une chaine par expressions réguliéres.
    Par madina dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/11/2011, 12h43
  2. Découpage d'une chaine via expressions régulières
    Par 65days dans le forum Général Java
    Réponses: 3
    Dernier message: 07/12/2009, 21h02
  3. Extraire une chaine avec expression reguliere
    Par spooky39 dans le forum WinDev
    Réponses: 8
    Dernier message: 10/04/2009, 14h21
  4. Substition de chaines via expressions régulières
    Par Katyucha dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 28/02/2007, 09h53
  5. Réponses: 2
    Dernier message: 10/07/2002, 11h51

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