[C#] Regex.Replace

Résolu
cs_Krasha Messages postés 36 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 29 mars 2010 - 24 sept. 2009 à 21:09
cs_Krasha Messages postés 36 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 29 mars 2010 - 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.

14 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
26 sept. 2009 à 23:55
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-
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
27 sept. 2009 à 11:27
;-)
Quelque chose comme ceci:

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


[hr]
-Blog-
-Site Perso-
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
24 sept. 2009 à 21:34
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-
0
cs_Krasha Messages postés 36 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 29 mars 2010
24 sept. 2009 à 22:56
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
25 sept. 2009 à 09:00
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-
0
cs_Krasha Messages postés 36 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 29 mars 2010
25 sept. 2009 à 11:11
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.
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
25 sept. 2009 à 11:28
Remplace var result par string[] result



[hr]
-Blog-
-Site Perso-
0
cs_Krasha Messages postés 36 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 29 mars 2010
25 sept. 2009 à 11:32
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.
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
25 sept. 2009 à 11:58
Me suis trompé... je voulais dire:
Remplace var result par IEnumerable<string> result
(le var fonctionne aussi bien sûr)


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

[hr]
-Blog-
-Site Perso-
0
cs_Krasha Messages postés 36 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 29 mars 2010
25 sept. 2009 à 19:15
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.
0
cs_Krasha Messages postés 36 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 29 mars 2010
27 sept. 2009 à 00:22
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.
0
cs_Krasha Messages postés 36 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 29 mars 2010
27 sept. 2009 à 12:52
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!
0
Rejoignez-nous