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 -
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
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
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 <
Xavier
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 <
Xavier
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...)
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...)
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
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