C# expressions regulieres

Fermé
trinity666 Messages postés 127 Date d'inscription samedi 24 mai 2003 Statut Membre Dernière intervention 17 août 2011 - 24 août 2007 à 14:24
trinity666 Messages postés 127 Date d'inscription samedi 24 mai 2003 Statut Membre Dernière intervention 17 août 2011 - 24 août 2007 à 15:21
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 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
24 août 2007 à 14:46
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 jeudi 14 octobre 2004 Statut Modérateur Dernière intervention 24 février 2011 1 793
24 août 2007 à 14:47
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 samedi 24 mai 2003 Statut Membre Dernière intervention 17 août 2011 2
24 août 2007 à 15:21
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