[C#] Regex.Replace [Résolu]

cs_Krasha 36 Messages postés mardi 25 septembre 2007Date d'inscription 29 mars 2010 Dernière intervention - 24 sept. 2009 à 21:09 - Dernière réponse : cs_Krasha 36 Messages postés mardi 25 septembre 2007Date d'inscription 29 mars 2010 Dernière intervention
- 27 sept. 2009 à 12:52
Bonjour à tous,

Je tente une regex pour extraire certaines données d'un fichier texte, j'ai des parenthèses capturantes (.+) qui renferment les valeurs à récupérer mais je ne connais pas la syntaxe exacte des regex.

En voici le code:
Regex RecupData = new Regex("Informations de fabrication
(.+)(.+)
(.+)(.+)
(.+)(.+)
(.+)(.+)
(.+)(.+)
(.+)(.+)
(.+)(.+)

<hr>");


On m'a dit que contrairement au php les parenthèses capturantes n'existaient pas en C#, je vous demande donc confirmation de cette information. Si c'est faux et que quelqu'un connait la syntaxe je suis bien sur intéressé.

(je tiens à préciser qu'en l'état actuelle ma regex capture la ligne entière, les valeurs inclues dans les (.+) apparaissent bien, je suppose donc que cette façon de faire est compatible avec C#)

Par contre je crois qu'il existe toujours la possibilité d'effacer le reste au cas où je ne pourrais récupérer le contenu de mes (.+). Seulement ma connaissance des regex (et de C# en général) étant assez faible, je sais repérer la bonne ligne avec les regex mais pas la méthode pour effacer ce qu'il y a en trop (les
,, <center>, et autres balises html)

Si je peux récupérer mes (.+) quelqu'un saurait il comment effacer les balises qui me gènent?

Merci à vous.
Afficher la suite 

14 réponses

Répondre au sujet
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 26 sept. 2009 à 23:55
+3
Utile
Ha, sorry pas vu que tu débutais !

Voici le code complet:

string s =   "
 Informations de fabrication 
Secteur : Agriculture
Variété/Variente :  Inconnu 
Temps de mise en place : 4 jour(s).
Quantité : 10000 kg tous les 4 jour(s).
Taille d'un produit : 1 kg
Rayon : Fruits et légumes
Débit magasin : 1000 unités / heure

<hr><center>";
            IEnumerable<string> result   Regex.Split(s, @"<[^\>]+\>").Where(c> !String.IsNullOrEmpty(c));
(foreach string s in result) Console.WriteLine(s); 


[hr]
-Blog-
-Site Perso-
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Bidou
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 27 sept. 2009 à 11:27
+3
Utile
;-)
Quelque chose comme ceci:

(foreach string s in result)
{
   xx.Write("\t"); // tabulation
   xx.Write(s); // ton string
} 


[hr]
-Blog-
-Site Perso-
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Bidou
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 24 sept. 2009 à 21:34
0
Utile
C# connaît les expressions régulières AU MOINS autant bien que PHP, tu peux me croire sur parole. C'est évident que les groupes existent et fonctionnent également avec le caractère qui est la parenthèse ronde. On a également la possibilité de nommer explicitement les groupes avec la sytnaxe suivante : (?<label>regex).

Concernant ton problème précis, il faut mettre un exemple de texte que tu veux capturer, trop compliqué pour aider sinon.


[hr]
-Blog-
-Site Perso-
Commenter la réponse de cs_Bidou
cs_Krasha 36 Messages postés mardi 25 septembre 2007Date d'inscription 29 mars 2010 Dernière intervention - 24 sept. 2009 à 22:56
0
Utile
Ok alors voici la ligne que je récupère grâce au regex:

Informations de fabrication
Secteur : Agriculture
Variété/Variente : Inconnu
Temps de mise en place : 4 jour(s).
Quantité : 10000 kg tous les 4 jour(s).
Taille d'un produit : 1 kg
Rayon : Fruits et légumes
Débit magasin : 1000 unités / heure

<hr><center>


Maintenant je colore en rouge tout ce que je dois récupérer de cette ligne (en fait j'exclue les balises HTML) :

Informations de fabrication
Secteur : Agriculture
Variété/Variente : Inconnu
Temps de mise en place : 4 jour(s).
Quantité : 10000 kg tous les 4 jour(s).
Taille d'un produit : 1 kg
Rayon : Fruits et légumes
Débit magasin : 1000 unités / heure

<hr><center>

Biensur il faut comprendre que j'ai plusieurs pages construites de la même façon, les balises HTML seront les mêmes et dans le même ordre sur chaque page. Seules les informations en rouge varient d'une page à l'autre.

Les passages en rouges sont ceux qui sont représentés par les (.+) de ma regex, malheureusement c'est la seule chose dont j'ai besoin mais je ne sais pas comment ne garder qu'eux.

Si ça peut t'aider à comprendre ce que je cherche à faire.
Commenter la réponse de cs_Krasha
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 25 sept. 2009 à 09:00
0
Utile
Quelque chose comme ceci:

            string s =   "
 Informations de fabrication 
Secteur : Agriculture
Variété/Variente :  Inconnu 
Temps de mise en place : 4 jour(s).
Quantité : 10000 kg tous les 4 jour(s).
Taille d'un produit : 1 kg
Rayon : Fruits et légumes
Débit magasin : 1000 unités / heure

<hr><center>";
            var result   Regex.Split(s, @"<[^\>]+\>").Where(c> !String.IsNullOrEmpty(c));



[hr]
-Blog-
-Site Perso-
Commenter la réponse de cs_Bidou
cs_Krasha 36 Messages postés mardi 25 septembre 2007Date d'inscription 29 mars 2010 Dernière intervention - 25 sept. 2009 à 11:11
0
Utile
Salut,

En fait la seule valeur que je récupère avec le Regex.Split proposé ci-dessus c'est ça :
System.Linq.Enumerable+WhereArrayIterator`1[System.String]


Je n'en comprends pas le sens, mais apparemment ça ne fonctionne pas.

Mais je vais explorer un peu les Regex.Split que je ne connaissais pas.
Commenter la réponse de cs_Krasha
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 25 sept. 2009 à 11:28
0
Utile
Remplace var result par string[] result



[hr]
-Blog-
-Site Perso-
Commenter la réponse de cs_Bidou
cs_Krasha 36 Messages postés mardi 25 septembre 2007Date d'inscription 29 mars 2010 Dernière intervention - 25 sept. 2009 à 11:32
0
Utile
J'avais essayé déjà de le mettre en String parce que je ne comprenais pas ce que le var venait faire ici

Mais ça me donne une erreur:
"Impossible de convertir implicitement le type 'System.Collections.Generic.IEnumerable<string>' en 'string'. Une conversion explicite existe (un cast est-il manquant ?)"

Je ne sais pas d'où ça vient.
Commenter la réponse de cs_Krasha
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 25 sept. 2009 à 11:58
0
Utile
Me suis trompé... je voulais dire:
Remplace var result par IEnumerable<string> result
(le var fonctionne aussi bien sûr)


[hr]
-Blog-
-Site Perso-
Commenter la réponse de cs_Bidou
cs_Krasha 36 Messages postés mardi 25 septembre 2007Date d'inscription 29 mars 2010 Dernière intervention - 25 sept. 2009 à 13:04
0
Utile
Ca me donne le même message d'erreur:
System.Linq.Enumerable+WhereArrayIterator`1[System.String]
Commenter la réponse de cs_Krasha
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 25 sept. 2009 à 14:39
0
Utile
Ben faut pas faire un ToString dessus lol!
(foreach string s in result) Console.WriteLine(s);

[hr]
-Blog-
-Site Perso-
Commenter la réponse de cs_Bidou
cs_Krasha 36 Messages postés mardi 25 septembre 2007Date d'inscription 29 mars 2010 Dernière intervention - 25 sept. 2009 à 19:15
0
Utile
Alors j'ai du mal interpréter ton message précédent désolé.

Maintenant mon code ressemble à ça:
//string s =   "
 Informations de fabrication 
Secteur : Agriculture
Variété/Variente :  Inconnu 
Temps de mise en place : 4 jour(s).
Quantité : 10000 kg tous les 4 jour(s).
Taille d'un produit : 1 kg
Rayon : Fruits et légumes
Débit magasin : 1000 unités / heure

<hr><center>";
                    MatchCollection res   = RecupData.Matches(str);
                    //IEnumerable<string> result Regex.Split(s, @"<[^\>]+\>").Where(c> !String.IsNullOrEmpty(c));


Tu me conseilles quoi exactement? comme je le disais plus haut je débute en C# (et dans la programmation de manière générale) Donc quand tu me dis: "Remplace var result par IEnumerable<string> result" je suis tes conseils à la lettre. Je n'ai pas cherché a changer quoi que se soit.

Je n'ai pas fait de .ToString mais peut-être que "IEnumerable<string> result" revient à la même chose?

Bref je suis perdu là, que dois faire plus précisément?

En tout cas merci pour le temps que tu m'accordes.
Commenter la réponse de cs_Krasha
cs_Krasha 36 Messages postés mardi 25 septembre 2007Date d'inscription 29 mars 2010 Dernière intervention - 27 sept. 2009 à 00:22
0
Utile
Oh que c'est bon quand ça marche !
Merci beaucoup, ça fonctionne Bidou enfin.

J'ai du changer le nom de variable pour que ça fonctionne (peut pas utiliser deux fois la variable 's' dans le même code), et j'ai remplacer le Console.WritleLine(s) par writer.WriteLine(x) pour écrire dans un fichier au lieu d'afficher dans la console mais c'était vite trouvé comme modif.

Par contre comment faire pour écrire le résultat sur une ligne (avec par exemple une tabulation entre chaque donnée) et pas une donnée récupérée par ligne? Parce que ça me prend quand même 15 lignes au lieu d'une seule, alors imagine quand j'aurais traité les quelques 700 fichiers qui doivent passer par ce code, je me retrouverais avec 10.500 lignes! Déjà que 700 je trouvais ça beaucoup...

En tout cas merci tu m'enlèves une sacrée épine du pied.
Commenter la réponse de cs_Krasha
cs_Krasha 36 Messages postés mardi 25 septembre 2007Date d'inscription 29 mars 2010 Dernière intervention - 27 sept. 2009 à 12:52
0
Utile
Nickel, parfait, merveilleux! J'en ai le kiki tout dur!

(bon j'en fais peut être un peu trop mais tu l'auras compris ça fonctionne pile poil!)

Comment j'ai fait pour ne pas me rendre compte du .WriteLine qui biensur me fassait passer à la ligne à chaque donnée récupérée?!?

A force d'être les yeux collés au même bout de code pendant un certain temps, on fini par ne plus y voir l'essentiel.

Tout mon problème a été réglé par deux lignes de code:
IEnumerable<string> result Regex.Split(str, @"<[^\>]+\>").Where(c> !String.IsNullOrEmpty(c));
                    foreach (string x in result) writer.Write("\t" + x);


Et surtout grâce à toi. Merci Bidou!
Commenter la réponse de cs_Krasha

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.