Expression reguliere [Résolu]

Signaler
Messages postés
209
Date d'inscription
dimanche 8 juin 2003
Statut
Membre
Dernière intervention
9 février 2012
-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
-
Bonjour,

est il possible avec une expression reguliere de modifier du texte mis entre des balise comme ceci :

<!--BALISE-->Texte ICI<!--FINBALISE-->

Je voudrai modifier le Texte ICI

Est-ce possible ?

Citt_jr
Bats toi avec les meilleurs, crève avec le reste

http://www.tsubara.net

10 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
Euh je crois que si...
Voilà une méthode que j'avais faite pour retrouver le text entre deux balises... à toi de l'adapter pour qu'on  puisser modifier le text et pas seulement le lire :

public static Match GetStringBetween(string txt, string start, string end, string groupName)
{
         string pattern = string.Format("({0})(?<{2}>.*?)({1})", start, end, groupName);
         return Regex.Match(txt, pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline);
}

<hr size="2" /> VC# forever
=13319
Messages postés
209
Date d'inscription
dimanche 8 juin 2003
Statut
Membre
Dernière intervention
9 février 2012
3
Grace a toi je me suis fait ma petite fonction qui me retourne le string contenu entre les balises, donc je n'ai plus qu'a faire un replace des balise plus le texte trouvé.

Voici mon bout de code :

static
void Main(
string[] args)
{

string text =
"qsdfbhqjsdvcksjbdo
<!--TEST-->ICI<!--FINTEST-->s<mdnvklqsdvsdnlk<sndvl";

string start =
"<!--TEST-->";

string end =
"<!--FINTEST-->";

string groupName =
"test";
string Value Reg_Exp(text, start, end, groupName);text text.Replace(

"<!--TEST-->" + Value +
"<!--FINTEST-->",
"<!--TEST-->REMPLACER<!--FINTEST-->");
}

static
string Reg_Exp(
string Text,
string Balise1,
string Balise2,
string groupName)
{

string pat =
string.Format(
"({0})(?<{2}>.*?)({1})", Balise1, Balise2, groupName);

Regex r =
new
Regex(pat,
RegexOptions.IgnoreCase);

Match m = r.Match(Text);

Group g = m.Groups[3];

CaptureCollection cc = g.Captures;

Capture c = cc[0];

return
Convert.ToString(c);
}

Citt_jr
Bats toi avec les meilleurs, crève avec le reste

http://www.tsubara.net
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
Tu peux faire un peu plus simple quand même, je ne sais plus pourquoi j'avais mis cette histoire de groupe en paramètre. Bref, tu ne sembles pas en avoir besoin dans ton cas, donc on aurait plutôt ceci :

private
string Reg_Exp(
string Text,
string Balise1,
string Balise2,
string groupName
{
  
string pat =
string.Format(
"({0})(?<{2}>.*?)({1})", Balise1, Balise2, groupName);
  
Regex r =
new
Regex(pat,
RegexOptions.IgnoreCase);
  
return r.Match(Text).Groups[groupName].Value
}

<hr size="2" /> VC# forever
=13319
Messages postés
143
Date d'inscription
vendredi 28 janvier 2005
Statut
Membre
Dernière intervention
25 octobre 2006

il faut que tu passe par une autre chaine de caractere. pour pouvoir modifier le texte.
Messages postés
209
Date d'inscription
dimanche 8 juin 2003
Statut
Membre
Dernière intervention
9 février 2012
3
Ca n,e marche pas en expression regulaire comme en PHP ?

Citt_jr
Bats toi avec les meilleurs, crève avec le reste

http://www.tsubara.net
Messages postés
209
Date d'inscription
dimanche 8 juin 2003
Statut
Membre
Dernière intervention
9 février 2012
3
Ok, tu pourrait me donner un exemple de ton code car la je vois pas trop ;)

Citt_jr
Bats toi avec les meilleurs, crève avec le reste

http://www.tsubara.net
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
string imgUrl = Helpers.GetStringBetween(pageContent, @"width=""100%"" align=""center"">\r\n", "imgUrl").Groups["imgUrl"].Value;

  - pageContent, c'est tout un text (par exemple, tout le contenu d'un fichier)
Ensuite, je mets les deux bornes (je veux le texte qui se trouve entre ces deux textes)
  - @"width=""100%"" align=""center"">\r\n"
  - imgUrl, c'est le nom du groupe. J'en avais besoin (je ne sais plus pourquoi) mais ça ne sera pas forcément ton cas, donc tu peux faire la fonction en enlevant ce paramètre je pense...

Y'a peut-être plus simple, à vrai dire que je ne suis pas un spécialiste des expressions régulières. En tout cas, ça marche...

<hr size="2" /> VC# forever
=13319
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
Encore mieux en fait :

private
void Test()
{
  
string text =
"qsdfbhqjsdvcksjbdo
<!--TEST-->ICI<!--FINTEST-->s<mdnvklqsdvsdnlk<sndvl";
  
string start =
"<!--TEST-->";
  
string end =
"<!--FINTEST-->";
  
string value = Replace(text, start, end)
}

private
string Replace(
string Text,
string Balise1,
string Balise2)
{
  
string pat =
string.Format(
"({0})(.*?)({1})", Balise1, Balise2);
  
return
Regex.Replace(Text, pat,
"REMPLACER",
RegexOptions.IgnoreCase)
}

<hr size="2" /> VC# forever
=13319
Messages postés
209
Date d'inscription
dimanche 8 juin 2003
Statut
Membre
Dernière intervention
9 février 2012
3
Merci pour l'optimisation ca va mieux maintenant. Je developpe normalement en PHP donc le c# c'est juste un passe temps ;)

Citt_jr
Bats toi avec les meilleurs, crève avec le reste

http://www.tsubara.net
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
Peut-être qu'on peut faire encore mieux, comme je te l'ai dit, les expressions régulières ça jamais été trop ma tasse de thé

<hr size= "2" /> VC# forever
=13319