Il semble que vous cherchiez la méthode Replace
avec une surcharge qui accepte un MatchEvaluator. La page MSDN de cette méthode peut être trouvée here.
Essayez ceci:
string input = "[img]http://imagesource.com[/img]";
string pattern = @"\[img]([^\]]+)\[\/img]";
string result = Regex.Replace(input, pattern, m =>
{
var url = m.Groups[1].Value;
// do something with url here
// return the replace value
return @"<img src=""" + url + @""" border=""0"" />";
},
RegexOptions.IgnoreCase);
Il utilise un lambda à plusieurs instructions pour simplifier le travail avec le groupe et effectuer plus de logique avant de retourner la valeur de remplacement. Vous pouvez, bien sûr, sortir avec ce lieu:
string result = Regex.Replace(input, pattern,
m => @"<img src=""" + m.Groups[1].Value + @""" border=""0"" />",
RegexOptions.IgnoreCase);
Dans le cas ci-dessus, il n'y a pas besoin pour le return
mais il est juste de retourner la chaîne d'origine sans évaluation supplémentaire. Vous pouvez coller quelques opérateurs ternaires et ajouter cette logique, mais cela aura l'air désordonné. Un lambda multi-déclaration est beaucoup plus propre. Vous pouvez envisager de le décomposer dans sa propre méthode, comme indiqué dans le lien MSDN mentionné ci-dessus, si elle est trop grande ou sera réutilisée dans d'autres efforts Regex.Replace
.
BTW, j'ai également simplifié votre modèle légèrement en supprimant les évasions pour ]
. Seule l'ouverture [
doit être échappée.
L'analyse de bbcode avec regex présente les mêmes inconvénients que l'analyse de code HTML avec regex, car les deux langues ne sont pas les mêmes. Voir http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 Vous devriez vous pencher sur l'utilisation d'un analyseur bbcode (une recherche google rapide trouvé http: //bbcode.codeplex.com/ par exemple) –