C# expressions regulieres

trinity666 Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   -  
trinity666 Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   -
bonjour



je cree des post dans un fichier xml et je souhaite pouvoir les supprimer, les posts sont de la forme

<post><titre></titre><msg></msg></post>

voici ma fonction de suppression, je ne comprends pas pourquoi l'expression régulière n'est pas trouvée dans le fichier xml



public static void supprPost(string path,string titre) {



string s1 = "<post>" + "<titre>" + titre + "</titre>" + "<msg>";

string s2 = "</msg>" + "</post>";

Regex reg= new Regex(s1+"*"+s2);


string s = xml2string(path);//stocke le contenu du fichier xml dans une string



if (reg.IsMatch(s)) { Console.WriteLine("trouvé "+reg.ToString()); }

else { Console.WriteLine("non trouvé " + reg.ToString()); } //renvoie toujours non trouvé



s = reg.Replace(s, "");



StreamWriter filexml = new StreamWriter(path);

filexml.WriteLine(s);



filexml.Close();

}

si on remplace Regex reg= new Regex(s1+"*"+s2); par Regex reg= new Regex(s1+".*"+s2); il va supprimer tous les posts qui se trouvent apres l occurence qui ne devraient pas l'etre

merci par avance de votre aide

3 réponses

Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
Bonjour,

Essaie quelque chose de ce genre :
Regex reg= new Regex(s1+"[^<]*"+s2);

par contre, cela interdit tout signe < dans le poste, mais logiquement tu dois les avoir remplacés par des &lt;

Xavier
0
teebo Messages postés 33491 Date d'inscription   Statut Modérateur Dernière intervention   1 793
 
Bonjour,

Premièrement, un truc qui m'étonne, pourquoi utiliser une regex alors que tu as un fichier xml?

Ensuite * ne fait pas parti des expressions régulières, c'est une wild card, ce n'est pas la même chose

Regarde l'explication chez oreilly par exemple.

Sinon pour ton deuxième exemple, . représente un caractère quelconque et * une suite de 0 à n fois le caractère précédent (c'est à dire en fait ici n'importe quelle chaîne...)

0
trinity666 Messages postés 127 Date d'inscription   Statut Membre Dernière intervention   2
 
il ne trouve à nouveau plus l'expression qd le post contenant le titre cherché n'est pas le premier
je vais essayer d'utiliser xmltextReader pr recopier le fichier en enlevant le contenu du post puis il me restera à supprimer les noeuds vides

en gros ca donne ca

public static void enlevePost(string path, string titre) {

XmlTextReader xmlfile = new XmlTextReader(path);
string res = "<?xml version=" + "\"" + "1.0" + "\"" + "?>"+"<document>";
string tmp = "";
try
{
while (xmlfile.Read())
{
if (xmlfile.LocalName == "post")
{
xmlfile.Read();
if (xmlfile.LocalName == "titre")
{
if ((tmp = xmlfile.ReadString()) != titre)
{
res +="<post><titre>"+ tmp+"</titre>";
}
else { xmlfile.Read(); xmlfile.Read(); }
}
xmlfile.Read();
if (xmlfile.LocalName == "msg")
{
res +="<msg>"+ xmlfile.ReadString()+"</msg></post>";
}
xmlfile.Read();
}

}
res += "</document>";
}
catch (Exception ex) { ex.ToString(); }
finally { xmlfile.Close(); }
StreamWriter sw = new StreamWriter(path);
sw.WriteLine(res);
sw.Close();

}
}

ct pas une bonne idee ca marche pas du tout
0