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 :

Regex , renvoie la chaine en totalité !


Sujet :

C#

  1. #1
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 43
    Par défaut Regex , renvoie la chaine en totalité !
    Bonjour a tous ,

    Le problème est dans le titre !

    J'ai cette chaine de caractère (string fichier2) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DTSTAMP:20100508T111130Z
    DTSTART:20100505T080000Z
    DTEND:20100505T110000Z
    SUMMARY:TP Info. Indust.
    LOCATION:AIP Robots\,AIP S108
    DESCRIPTION:\n3 A -gr 7a\nLORDONNE YVES\n(Exporté le:08/05/2010 13:11)
    UID:ADE52312d554850323030392d323031302d34343535352d302d31
    CREATED:19700101T000000Z
    LAST-MODIFIED:20100508T111130Z

    J'aimerais sortir uniquement la sous-chaine " AIP Robots" ;

    Pour cela je me suis servi de regex et de la fonction split ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Regex regex3 = new Regex("^AIP  ,$");
                   resultat = regex3.Split(fichier2); //renvoi la chaine modifiée
     
                   textBox7.Text = resultat[0];
    Le problème s'est qu'il me renvoie systèmatiquement la chaine en entier !

    Je pense que j'ai mal défini les paramètres du Regex ......

  2. #2
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Si tu veux extraire une partie de la chaîne un Split n'est pas adapté. Commence déjà par ça

  3. #3
    Membre émérite
    Avatar de gwinyam
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 162
    Par défaut
    Normal, dans ta regex, tu lui demandes de splitter à condition que ta chaîne démarre par AIP et finisse par une virgule. Ce qui n'est pas le cas dans ton fichier. Donc ne trouvant rien, il ne peut rien splitter et donc te renvoie la chaine de démarrage. Logique.

    La fonction split se sert de ta regex comme caractère de séparation, donc même si ta regex était bonne, tu n'aurais pas obtenu le résultat espéré. Regarde sa documentation ici: http://msdn.microsoft.com/en-us/library/ze12yx1d.aspx

    Et il vaudrait mieux ne pas utiliser les caractères ^ et $ si tu veux trouver une sous-chaîne.
    • ^ indique que c'est le tout premier caractère de ta chaine qui doit aussi être le premier de ta sous-chaine
    • $ indique que c'est le tout dernier caractère de ta chaine qui doit aussi être le dernier de ta sous-chaine
    Donc pas très efficace pour chercher un élément qui peut être n'importe où

  4. #4
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 43
    Par défaut
    Merci pour vos réponse !!!

    Donc si j'ai bien compris , l'expression que je dois utiliser est regex.match ????

  5. #5
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par kelvir
    Donc si j'ai bien compris , l'expression que je dois utiliser est regex.match ????
    Regex.Match c'est la méthode à utiliser, après pour l'expression (régulière) c'est autre chose

  6. #6
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 43
    Par défaut
    Je n'arrive pas a trouver l'expression régulière

    need help

  7. #7
    Rédacteur
    Avatar de benji_dv
    Homme Profil pro
    Architecte
    Inscrit en
    Juillet 2005
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 375
    Par défaut
    Que veux tu récupérer exactement :
    la chaine qui suit AIP
    la chaine qui suit LOCATION:

    quel est le caractère de fin de chaine à récupérer ?
    Benjamin DEVUYST
    Et comme l'a dit Rick Osborne
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live"
    http://bdevuyst.developpez.com
    http://blog.developpez.com/bdevuyst
    www.bdevuyst.com

  8. #8
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Utilise l'expression
    avec la méthode Regex.Match. Un petit coup d'oeil à l'article pour voir comment récupérer la valeur du groupe et le tour devrait être joué

  9. #9
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 43
    Par défaut
    J'aimerais sortir AIP Robots .

    EDIT : Merci , ta méthode fonctionne !

    J'essaye de comprendre l'expression mais j'ai un peu de mal

  10. #10
    Rédacteur
    Avatar de benji_dv
    Homme Profil pro
    Architecte
    Inscrit en
    Juillet 2005
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 375
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    System.Text.RegularExpressions.Regex.Match(
       "chaine de char source",
       @"LOCATION:(?<aip>AIP.*)\r\n")
    .Result("${aip}")
    ca marche,

    J'explique :
    tu lui demande une trouver une chaine, que tu places dans un groupe nommé "aip",
    ce groupe est précédé de "LOCATION:" et est suivi par \r\n

    ensuite tu récupère le résultat par la méthode résult en utilisant le groupe nommé,

    voilou,

    Benjamin
    Benjamin DEVUYST
    Et comme l'a dit Rick Osborne
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live"
    http://bdevuyst.developpez.com
    http://blog.developpez.com/bdevuyst
    www.bdevuyst.com

  11. #11
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par kelvir
    J'essaye de comprendre l'expression mais j'ai un peu de mal
    Lit tranquillement l'article, chapitres 3.7 et 4.3, et si tu ne comprends toujours pas on précisera

    Pour benji_dv, avec ton exemple tu récupères tout jusqu'au bout de la ligne alors qu'il faut à priori s'arrêter au premier \ vu l'exemple qu'il donne. Mais c'est en supposant que l'exemple soit bon

  12. #12
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 43
    Par défaut
    J'ai légèrement modifié le code et l'expression régulière ne renvoie plus la bonne sous chaine !!!

    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
                  MatchCollection matches = Regex.Matches(fichier2, "LOCATION:([^\\\\]+)");
     
     
     
                  for (int i = 0; i < matches.Count; i++)
                  {
                      results[i] = matches[i].Value;
     
                  }
     
     
                  MessageBox.Show(results[1]);
                  MessageBox.Show(results[2]);
                  MessageBox.Show(results[3]);
                  MessageBox.Show(results[4]);

    Je veux sortir l'ensemble des sous-chaine commencant par LOCATION :

    Il me renvoit bien les sous chaine mais avec LOCATION :

    Exemple : LOCATION : AIP Robots
    ALors que je souhaitais uniquement AIP Robots !

  13. #13
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    C'est la valeur du groupe que tu dois récupérer. Comme dit précédemment, chapitre 4.3 de l'article il y a un exemple

  14. #14
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 43
    Par défaut
    Je suis en méthodé matches , je recupère l'ensemble des occurences que je veux mettre dans un tableau !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
         MatchCollection matches = Regex.Matches(fichier2, "LOCATION:([^\\\\]+)");
     
     
     
                  for (int i = 0; i < matches.Count; i++)
                  {
                      results[i] = matches[i].Value;
     
                  }

    resultat me retourne bien un tableau contenant l'ensemble des occurences , mais il contient LOCATION : Aip robots



    EDIT : et de plus il n'accepte pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    results[i]=matches.groups[i].value ;

  15. #15
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Tu y es presque.

    Dans ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    results[i]=matches.groups[i].value;
    Ce n'est pas matches qu'il faut utiliser, l'objet n'est pas du bon type. Si à la compilation ce n'est pas passé c'est qu'il y a une bonne raison
    Regarde l'exemple encore un coup

  16. #16
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 43
    Par défaut
    ..

  17. #17
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Les groupes sont liés à un objet Match et non MatchCollection, on le voit sur la MSDN par exemple.

    Ta variable matches est de type MatchCollection, c'est à dire une collection d'objets de type Match. Il faut donc accéder à un objet de la collection pour accéder ensuite aux groupes. Ensuite les groupes sont numérotés, là tu as un seul groupe et son index est 1 (l'index 0 correspond au Match complet).

    Au final
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    results[i] = matches[i].Groups[1].Value;
    Et dans l'exemple de l'article la variable match et de type Match. Mais après il ne faut pas copier/coller le code, il faut savoir l'interpréter, comme tout exemple.
    Donc soit tu fais un foreach, soit tu fais un for, mais n'imbriques pas les deux

    Edit : c'est pas bien de supprimer le contenu du message précédent

  18. #18
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 43
    Par défaut
    Ca fonctionne !!!

    Merci

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

Discussions similaires

  1. REGEX dans une chaine x;x;x
    Par Kinian dans le forum Requêtes
    Réponses: 4
    Dernier message: 26/10/2007, 18h20
  2. Question sur les Regex. interdire une chaine
    Par cysboy dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/05/2007, 14h49
  3. Javascript : Regex !? Remplacer une chaine dont on ne connait pas la valeur
    Par adrianevens dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/01/2007, 17h03
  4. [Regex] Recherche sous chaine, debutant
    Par Tekone dans le forum Langage
    Réponses: 1
    Dernier message: 14/06/2006, 01h18
  5. Réponses: 31
    Dernier message: 25/10/2005, 19h26

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