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 :

Expressions régulières dans C#


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Par défaut Expressions régulières dans C#
    Bonjour à tous,

    Je cherche à parser une chaine avec une regexp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Regex reLastNumber = new Regex(@"CRYST1\s+([\.0-9]+)\s+([\.0-9]+)\s+([\.0-9]+)\s+([\.0-9]+)\s+([\.0-9]+)\s+([\.0-9]+)\s+C(\s+[\.0-9]+)+");
    La chaine est soit la première, soit la seconde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    line = "CRYST1   60.009   61.046   62.671  90.00 201.60  80.00 C 1 2 1       4";
     
    line = "CRYST1   60.135   61.902   60.865  90.00  102.41  90.00 C 2           4";
    et je veux obtenir le dernier nombre (on peut voir que le nombre de nombre après le 'C' est variable).

    ma regexp matche bien la chaine mais si je veux obtenir le dernier nombre par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    numberTmp = double.Parse(reLastNumber.Match(line).Groups[reLastNumber.Match(line).Groups.Count].Value);
    çà plante car le dernier nombre est une chaine vide.

    Auriez-vous une solution ?

    Merci beaucoup par avance.

    Laurent.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    C'est quel nombre dans tes 2 cas que tu veux trouver?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Par défaut
    BenoitM,

    C'est le dernier nombre de la chaine que je veux trouver.

    Laurent.

  4. #4
    Modérateur
    Avatar de toopac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 940
    Par défaut
    Si c'est le dernier nombre, pourquoi ne pas faire simplement ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Regex reLastNumber = new Regex(@"\d+$");
     
    double numberTmp = double.Parse(reLastNumber.Match(line).Value);

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    Methode je suis un bourin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string[] arr=String.Split(" ",line); 
    double.Parse(arr[arr.Lenght-1]);

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Par défaut
    Merci BenoitM et toopac pour vos réponses,

    En fait, les chaines que je parse sont contenues dans un fichier qui contient des milliers de lignes toutes différentes.

    C'est pourquoi je suis obligé de sélectionner la ligne par ma regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Regex reLastNumber = new Regex(@"CRYST1\s+([\.0-9]+)\s+([\.0-9]+)\s+([\.0-9]+)\s+([\.0-9]+)\s+([\.0-9]+)\s+([\.0-9]+)\s+C(\s+[\.0-9]+)+");
    Ce serait bien si je pouvais sélectionner la ligne et obtenir la dernière valeur de la ligne avec une seule regexp.

    Laurent.

  7. #7
    Modérateur
    Avatar de toopac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 940
    Par défaut
    Si tu lis ton fichier ligne par ligne, je ne vois pas le problème
    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    string line;
    Regex reLastNumber = new Regex(@"\d+$");
    double numberTmp;
    using (StreamReader reader = new StreamReader(@"C:\myfile.txt"))
    {
        while ((line = reader.ReadLine()) != null)
        {
            numberTmp = double.Parse(reLastNumber.Match(line).Value);
            //[...]
        }
    }
    Sinon si tu lis le fichier d'un coup
    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
    string file;
    using (StreamReader reader = new StreamReader(@"C:\myfile.txt"))
    {
        file = reader.ReadToEnd();
    }
     
    Regex crystLine = new Regex(@"CRYST1\s+([\.0-9]+)\s+([\.0-9]+)\s+([\.0-9]+)\s+([\.0-9]+)\s+([\.0-9]+)\s+([\.0-9]+)\s+C(\s+[\.0-9]+)+");
    Regex lastNumber = new Regex(@"\d+$");
     
    MatchCollection matches = crystLine.Matches(file);
    foreach (Match match in matches)
    {
        numberTmp = double.Parse(lastNumber.Match(match.ToString()).Value);
        //[...]
    }

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Par défaut
    toopac,

    Je lis le fichier ligne par ligne.

    Si tu lis ton fichier ligne par ligne, je ne vois pas le problème
    Le problème est de repérer la ligne : "CRYST..."...

    Je ne vois pas comment se passer de ma regexp...

    Sinon ta solution avec les 2 regexp est efficace, je l'ai testée, elle marche (dans le cas d'une lecture ligne par ligne).

    Mais c'est moins élégant que de faire une seule regexp ;-)

    Laurent.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Par défaut
    Ta réponse me fait revoir mes ambitions à la baisse : je pensais qu'on pouvait faire les deux.

    En tout cas merci beaucoup pour ton aide et tes lumières sur les regexp !!

    Je vais adopter ta solution.

    Laurent.

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Par défaut
    Bonjour,

    Tu peux vérifier que la ligne correspond à ta Regex avec un IsMatch, qui renvoi un booléen. Si c'est le cas, tu parses ta ligne de la fin et tu récupères le dernier chiffre...!

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Par défaut
    farfouch00,

    Merci pour ton conseil.

    C'est ce que je vais faire :

    je recherche la ligne voulue et ensuite je recherche le dernier nombre de la ligne.

    Laurent.

  12. #12
    Modérateur
    Avatar de toopac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 940
    Par défaut
    En fait j'ai lu ton premier post un peu en diagonale...
    En fait t'avais presque la bonne réponse.
    Le dernier élément d'une collection n'est pas tab[tab.Count], mais tab[tab.Count - 1].
    Du coup numberTmp = double.Parse(reLastNumber.Match(line).Groups[reLastNumber.Match(line).Groups.Count - 1].Value); devrait fonctionner.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Par défaut
    En fait,

    les reLastNumber.Match(line).Groups[x].Value

    renvoyaient des valeurs fausses pour x > 6 (après le 'C') ce qui prouvait que ma regexp était correcte pour matcher la ligne mais pas pour récupérer les valeurs...

    Donc je me suis rabattu sur ta solution des 2 regexp et çà marche, donc c'est déjà bien.

    Mais c'est sur, si quelqu'un a une solution avec 1 seule regexp : je suis preneur !

    Laurent.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 14/12/2007, 23h26
  2. Utilisation d'expressions régulières dans GTK
    Par bit_o dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 11/04/2007, 19h24
  3. [RegEx] Utiliser une expression régulière dans une requête
    Par Tobleron dans le forum Langage
    Réponses: 2
    Dernier message: 18/02/2007, 19h00
  4. Réponses: 5
    Dernier message: 30/10/2006, 13h59
  5. Réponses: 1
    Dernier message: 03/02/2006, 12h35

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