C# expressions regulieres

trinity666 Messages postés 131 Statut Membre -  
trinity666 Messages postés 131 Statut Membre -
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 3742 Statut Membre 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 33570 Statut Modérateur 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 131 Statut Membre 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