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

C# Discussion :

[C#] Regular Expression


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut [C#] Regular Expression
    Bonjour a tous et joyeux noël !

    J'ai un petit probleme avec des regexp en c# je recupere le code HTML d'une page et je soutairais recuperer ce qu'il y a entre les balise <h1></h1>.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            private void GetTitle()
            {
                Regex title = new Regex("<h1>(?<title>)</h1>");
                Match m = title.Match(this._contentInformations);
                if (m.Success)
                {
                    this._map["Title"] = m.Groups["title"].Value;
                }
            }
    Or m.success = false alors que la page contient bien la balise h1.

    Comment faire ?

    Merci !

  2. #2
    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
    Ben ton groupe de capture ne contient rien, donc ça ne marchera que pour une balise h1 vide... Avec ça, ça devrait marcher mieux :

    "<h1>(?<title>.+)</h1>"

    Note que les expressions régulières sont particulièrement inadaptées pour parser du HTML... utilise plutôt le DOM (HtmlDocument) si ton HTML est affiché dans un WebBrowser, ou alors un outil comme le HTML Agility Pack.
    On ne peut malheureusement pas utiliser un parser XML, car ceux-ci nécessitent un document XML valide (et c'est rarement le cas pour du HTML...)

  3. #3
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    tomlev:

    Je profite de la situation pour te demander un petit complément. Si on code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Regex title = new Regex("<h1>(?<title>.+)</h1>");
    Match m = title.Match(@"<h1>Bonjour</h1><h1>Adieu</h1>");
    if (m.Success)
        MessageBox.Show(m.Groups["title"].Value);
    ça affiche: "Bonjour</h1><h1>Adieu"

    Normal puisque le texte est compris entre les deux balises.

    Mais quelle serait la syntaxe pour obtenir les 2 résultats "Bonjour" et "Adieu" ?

    Papy

  4. #4
    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 Papy214 Voir le message
    Mais quelle serait la syntaxe pour obtenir les 2 résultats "Bonjour" et "Adieu" ?
    "<h1>(?<title>.+?)</h1>"

    Le modificateur "?" après le "+" signifie "le moins de caractères possible" (lazy). Le comportement par défaut est de prendre le plus de caractères possible (eager)

  5. #5
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Citation Envoyé par tomlev Voir le message
    "<h1>(?<title>.+?)</h1>"

    Le modificateur "?" après le "+" signifie "le moins de caractères possible" (lazy). Le comportement par défaut est de prendre le plus de caractères possible (eager)
    Ca fait des années que j'essaye de comprendre ce truc et je reste lamentable sur ce sujet

    J'ai rajouté le ? comme tu l'indiques mais du coup c'est le code qui doit plus coller. J'obtiens 2 affichages avec
    <h1>Bonjour</h1>
    suivi de
    Bonjour

    Je vais continuer à essayer de trouver enfin un tutoriel qui explique ça de façon claire ....

    Merci quand même pour cette indication sur le lazy et le eager.


    suite ...

    Pour l'instant, j'en suis là, et pas mécontent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                foreach (Match item in new Regex("<h1>(?<title>.+?)</h1>").Matches(@"<h1>Bonjour</h1><h1>Adieu</h1>"))
                    MessageBox.Show(item.Groups[1].Value);

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 177
    Par défaut
    Pour ça moi j'utiliserai une autre expression régulière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "<h1>([a-z-A-Z]*)</h1>"
    et là tu aura bien Bonjour et Adieu

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

Discussions similaires

  1. Regular expression qui ne fonctionne pas
    Par Remedy dans le forum Langage
    Réponses: 2
    Dernier message: 11/05/2007, 16h52
  2. [Regular expression] Possessive quantifiers
    Par Pragmateek dans le forum Langage
    Réponses: 1
    Dernier message: 24/06/2006, 12h55
  3. [debutant] Regular Expression
    Par absolut75 dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 13/06/2006, 01h43
  4. [RegEx] Empty regular expression
    Par Khrysby dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2006, 22h25
  5. [Regular Expressions] Numérotation romaine
    Par ramalho dans le forum Valider
    Réponses: 3
    Dernier message: 24/02/2004, 17h43

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