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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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);
        //[...]
    }

+ 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