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

Dotnet Discussion :

[Regex c#] Arret a la premiere occurence trouvée


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 9
    Par défaut [Regex c#] Arret a la premiere occurence trouvée
    Bonsoir à tous,

    Il existe en php un mode "Ungreedy" quant l'on fait des expressions régulières.

    Celui-ci permet de créer une capture à la première occurrence trouvée.

    ex : - imaginons cette regex affreuse : "<li>(.+)</li>" appliquée a cette portion html :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <ul>
    <li>pif</li>
    <li>paf</li>
    <li>pouf</li>
    </ul>
    Avec un mode Ungreedy(U), l'array de résultat contient 3 entrées :
    res[0] = pif
    res[1] = paf
    res[2] = pouf

    En c# je ne trouve pas d'équivalence à ce mode (U) et mon matchcollection ne contient qu'un seul résultat :

    pif</li><li>paf</li><li>pouf

    L'exemple que je donne est bien entendu extremement balot, c'est juste pour illustrer mon propos.

    Existe t-il une équivalence a ce mode Ungreedy en c# ou faut-il boucler et boucler et re reboucler sur nos Match pour arriver au même résultat ?
    Je n'ai rien trouvé a ce propos sur msdn, aucune des RegexOption ne couvre cet aspect.

    Si il y'a une ame charitable pour me répondre, merci d'avance

    Bonne soirée/nuit

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    244
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 244
    Par défaut
    Avec les regex, tu peut demander à trouver toutes les occurence. Il te retourne alors une liste de résultat. Il te suffit de prendre le premier.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 9
    Par défaut
    Bonjour, merci d'avoir pris la peine de me repondre.

    Non, dans le cas que j'expose, il prend tout ce qui se trouve entre la premiere balise <li> et la toute dernière </li>. C'est justement le souci, il n'y a pas de Mathcollection de X elements, mais un seul résultat a ma capture.

    il ne capture pas chaque contenu de <li></li>, mais tout ce qui se trouve entre la première balise <li> et la dernière </li>, donc tout, y compris les balises html <li></li> se trouvant entre.

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    244
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 244
    Par défaut
    Chez moi cela marche tres bien. Tu dois avoir un pb dans ton code. Voici celui que j'utilise:

    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
    static void Main(string[] args)
    {
        string source = @"<ul>
        <li>pif</li>
        <li>paf</li>
        <li>pouf</li>
        </ul>";
    
        MatchCollection m = Regex.Matches(source, "<li>(.*)</li>");
    
        foreach(Match ma in m)
           foreach (Group g in ma.Groups)
              Console.WriteLine(g.Value);
    }
    Edit: Evidemment si tu veut tout le match c'est ma.Groups[0], sinon pour juste le contenue soit (.*) c'est ma.Groups[1].

  5. #5
    Membre éclairé Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Par défaut
    Je me permet de faire remonter ce sujet là car j'ai exactement le même problème et la solution proposée n'est pas correcte dans tous les cas.

    Si la chaîne de connexion est comme celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    string source = @"<ul>
    <li>aaa
    bbb
    ccc
    </li>
    <li>paf</li>
    <li>pouf</li>
    </ul>";
    Regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Regex maregex = new Regex(@"<li>(.*)</li>"
    MatchCollection m = testo.Matches(source);
    Match monmatch = m[0];
    m[0] = <li>paf</li>

    Comment faire la regex pour que :
    m[0] = <li>aaa
    bbb
    ccc
    </li>

    m[1] = <li>paf</li>

    m[2] = <li>pouf</li>


  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 9
    Par défaut
    Bonjour à tous,

    Suite à la remontée de ce sujet, je communique la réponse à la problématique que j'avais rencontré.

    La solution proposé par arasium n'est pas bonne car la capture retournée ne donne qu'une seule ligne.

    Pour résoudre le souci, il suffisait juste de modifier la regex de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <li>([a-zA-Z0-9_-]+)</li>
    Cependant, ATTENTION ! à bien rajouté les différents méta-caractères susceptible de se trouver dans nos résultats.

    la liste des différents méta-caractères est la suivante :
    # ! ^ $ ( ) [ ] { } ? + * . \

    Rappelons que la déclaration d'un méta-caractère doit être échappée avec \ sauf si celui-ci se trouve à l'intérieur d'une classe [].

    la regex donnée plus haut capturera donc n'importe quelle chaine contenant obligatoirement (+)
    une lettre en majuscule / minuscule ou un chiffre (a-zA-Z0-9)
    ou un _ ou un - (_-).

    Voilà j'espere avoir été clair.

    Bonne journée à tous.

    [Edit] : Au passage, un petit testeur de regex en ligne, réalisé en php et extrement bien fait :
    http://www.lumadis.be/regex/test_regex.php

    Il existe egalement sur le site code-source (mais je n'ai plus le lien sous la main) un testeur réalisé en C#, cependant moins complet sur la présentation des captures que celui que je viens de fournir.

    Bon pattern a tous :p

  7. #7
    Membre éclairé Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Par défaut
    Merci pour cette précision !
    Cependant mon problème est toujours présent

    Voilà le test que j'ai mis en place qui, je pense, représente bien le problème que je rencontre dans mon projet.

    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
    string source = @"DEBUT aaa
    aaa
    aaa
    FIN
    DEBUT bbb
    bbb
    bbb
    FIN
    DEBUT ccc FIN
    DEBUT ddd FIN";
     
    Regex testo = new Regex(@"DEBUT(?<createContent>(.*\n)*FIN)");
    MatchCollection m = testo.Matches(source);  
    Match ess1 = m[0];
    Match ess2 = m[1];
    Match ess3 = m[2];
    Actuellement, les match valent :
    ess1 = DEBUT aaa
    aaa
    aaa
    FIN
    DEBUT bbb
    bbb
    bbb
    FIN


    ess2 part en exception.

    Comment faire pour que :
    ess1 = DEBUT aaa
    aaa
    aaa
    FIN


    ess2 =DEBUT bbb
    bbb
    bbb
    FIN


    ess3 =DEBUT ccc FIN

    J'ai essayé plusieurs Regex dont celle proposée ci-dessus mais je ne parviens pas à résoudre mon problème.

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

Discussions similaires

  1. UPDATE des N premiers éléments trouvés
    Par gomodo dans le forum Requêtes
    Réponses: 1
    Dernier message: 07/05/2010, 17h27
  2. Sed : remplacer uniquement la premiere occurence
    Par kahya dans le forum Linux
    Réponses: 3
    Dernier message: 24/03/2010, 16h54
  3. [RegEx] Arrêter à la 1ere occurence trouvée ?
    Par tintin72 dans le forum Langage
    Réponses: 8
    Dernier message: 23/05/2009, 18h29
  4. Premiere occurence d'un entier dans une chaine
    Par amika dans le forum Langage
    Réponses: 3
    Dernier message: 04/05/2006, 20h04
  5. replacement jusqu'a la premiere occurence d'un terme
    Par HurtMarley dans le forum Web
    Réponses: 3
    Dernier message: 06/02/2006, 15h48

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