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

Messages postés
36
Date d'inscription
mardi 25 septembre 2007
Dernière intervention
29 mars 2010
- 24 sept. 2009 à 21:09 - Dernière réponse :
Messages postés
36
Date d'inscription
mardi 25 septembre 2007
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.
Afficher la suite 

Votre réponse

14 réponses

Meilleure réponse
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
- 26 sept. 2009 à 23:55
3
Merci
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-

Merci cs_Bidou 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de cs_Bidou
Meilleure réponse
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
- 27 sept. 2009 à 11:27
3
Merci
;-)
Quelque chose comme ceci:

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


[hr]
-Blog-
-Site Perso-

Merci cs_Bidou 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de cs_Bidou
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
- 24 sept. 2009 à 21:34
0
Merci
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
Messages postés
36
Date d'inscription
mardi 25 septembre 2007
Dernière intervention
29 mars 2010
- 24 sept. 2009 à 22:56
0
Merci
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
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
- 25 sept. 2009 à 09:00
0
Merci
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
Messages postés
36
Date d'inscription
mardi 25 septembre 2007
Dernière intervention
29 mars 2010
- 25 sept. 2009 à 11:11
0
Merci
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
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
- 25 sept. 2009 à 11:28
0
Merci
Remplace var result par string[] result



[hr]
-Blog-
-Site Perso-
Commenter la réponse de cs_Bidou
Messages postés
36
Date d'inscription
mardi 25 septembre 2007
Dernière intervention
29 mars 2010
- 25 sept. 2009 à 11:32
0
Merci
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
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
- 25 sept. 2009 à 11:58
0
Merci
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
Messages postés
36
Date d'inscription
mardi 25 septembre 2007
Dernière intervention
29 mars 2010
- 25 sept. 2009 à 13:04
0
Merci
Ca me donne le même message d'erreur:
System.Linq.Enumerable+WhereArrayIterator`1[System.String]
Commenter la réponse de cs_Krasha
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
- 25 sept. 2009 à 14:39
0
Merci
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
Messages postés
36
Date d'inscription
mardi 25 septembre 2007
Dernière intervention
29 mars 2010
- 25 sept. 2009 à 19:15
0
Merci
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
Messages postés
36
Date d'inscription
mardi 25 septembre 2007
Dernière intervention
29 mars 2010
- 27 sept. 2009 à 00:22
0
Merci
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
Messages postés
36
Date d'inscription
mardi 25 septembre 2007
Dernière intervention
29 mars 2010
- 27 sept. 2009 à 12:52
0
Merci
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.