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 :

Expréssion regulière sous C#


Sujet :

C#

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2007
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 401
    Points : 153
    Points
    153
    Par défaut Expréssion regulière sous C#
    Bonjour,

    J'ai des strings qui peuvent avoir le format suivant:

    France,FR,"Population ages 00-14, total",SP.POP.0014.TO,3835508

    Cette ligne a des informations correspondantes à 4 colonnes:
    France => Pays
    FR => Code pays
    Population ages 00-14, total => Description
    SP.POP.0014.TO => Label
    3835508 => Valeur

    À l'aide de regexp, je suis en train d'essayer de trouver le séparateur des champs. Dans de cas là c'est la virgule mais il peut varier (",", ";", etc.).

    Ainsi, actuellement j'ai cette expréssion régulière:

    string patternCSVDelimeter = "[^a-zA-Z0-9\"]+";
    Cependant elle n'est pas encore correcte car elle ne me permet pas d'exclure la virgule se trouvant dans la valeur "Population ages 00-14, total"

    Quelqu'un aurait-il une suggestion?

    Merci

  2. #2
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2005
    Messages : 165
    Points : 241
    Points
    241
    Par défaut
    Bonjour,

    Tu dois pouvoir écrire ton expression régulière pour directement récupérer tes infos en formant des groupes, un peu comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Regex qariRegex = new Regex("<td><a href=\"(.*?)\">(.*?)</a></td>");
    Dans ton cas, ce serait quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Regex qariRegex = new Regex("(.?),(.?),\"(.?)\",(.?),(.?)");
    Lien Microsoft : http://msdn.microsoft.com/fr-fr/libr...vs.110%29.aspx


    Seb

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Je te propose un pattern qui permet, en plus d'extraire les champs, de vérifier le format d'une ligne csv. (Ce format n'étant pas standard, je suis parti du principe que le caractère de protection s'échappait en le doublant.)

    Les deux cas de figure sont présents dans le pattern:
    • le champ protégé: "(?<field>(?>[^"]+|"")*)"
    • le champ non protégé: (?<field>[^,"]*)

    (J'ai utilisé des captures nommées pour ne pas avoir à se soucier du numéro du groupe.)

    Pour ce qui est de la structure de la ligne, j'ai imposé le point d'entré du pattern dans la chaîne de manière à n'obtenir que des correspondances adjacentes depuis le début de la chaîne.
    • \A est l'ancre de début de chaîne
    • \G est soit l'ancre de début de chaîne, soit la position dans la chaîne après la correspondance précédente.(Pour éviter le premier cas, j'ai ajouté un test négatif:(?!\A)\G.)


    Donc un champ ne peut se trouver qu'au début de la chaîne ou après une virgule qui suit immédiatement le champ précédant: (?:\A|(?!\A)\G,)
    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
    string input = @"France,FR,""Population ages 00-14, total"",SP.POP.0014.TO,3835508";
    string pattern = @"(?:\A|(?!\A)\G,)(?:""(?<field>(?>[^""]+|"""")*)""|(?<field>[^,""]*))";
     
    MatchCollection mc = Regex.Matches(input, pattern);
     
    // on affiche les résultats
    foreach (Match m in mc) {
        Console.WriteLine(m.Groups["field"].Value);
    }
     
    // on vérifie que le dernier résultat est bien à la fin de la chaîne et par conséquent que le  
    // format de la chaîne est correct. Pour cela on utilise l'index et la taille du dernier résultat.
    Match lm = mc[mc.Count -1];
    if (lm.Index + lm.Value.Length == input.Length ) {
        Console.WriteLine("OK");
    } else {
        Console.WriteLine("Format non conforme.");
    }
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Si tu es sûr du format et que tu n'as donc pas besoin de vérifier on peut essayer avec (un peu) moins d'overengineering :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string line = "France,FR,\"Population ages 00-14, total\",SP.POP.0014.TO,3835508";
    string[] tokens = line.Split('"')
                          .SelectMany((t, i) => i == 1 ? new[] { t } : t.Trim(',').Split(','))
                          .ToArray();
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

Discussions similaires

  1. Extraire sous-chaine avec expréssions régulières
    Par seanbean dans le forum Général Python
    Réponses: 3
    Dernier message: 11/03/2012, 19h13
  2. [Toutes versions] remplacer une sous-chaine dans une expression regulière
    Par issoram dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/05/2011, 15h12
  3. Mon expression regulière retourne toujorus True sous IE7
    Par anaranjado dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 15/08/2009, 11h55
  4. Réponses: 0
    Dernier message: 11/11/2007, 15h04
  5. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18

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