Похоже, вы ищете метод Replace
с перегрузкой, которая принимает MatchEvaluator. Страница MSDN для этого метода может быть найдена here.
Попробуйте вместо этого:
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);
Это использует мульти-заявление лямбда для упрощения работы с группой и выполняя больше логики перед возвратом стоимости замены. Можно, конечно, уйти с этим вместо того, чтобы:
string result = Regex.Replace(input, pattern,
m => @"<img src=""" + m.Groups[1].Value + @""" border=""0"" />",
RegexOptions.IgnoreCase);
В вышеуказанном случае нет необходимости в return
, но это просто возвращая исходную строку без дополнительной оценки. Вы могли бы придерживаться нескольких тернарных операторов и добавлять эту логику, но это будет выглядеть беспорядочно. Многопрофильная лямбда намного чище. Вы можете рассмотреть его по своему собственному методу, как показано в вышеупомянутой ссылке MSDN, если оно слишком велико или будет повторно использовано в других усилиях Regex.Replace
.
BTW, я также упростил ваш рисунок, удалив экраны для ]
. Необходимо только экранировать [
.
Разбор bbcode с регулярным выражением имеет те же недостатки, что и разбор HTML с регулярным выражением, так как ни один из них не является обычным языком. См. Http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454. Вы должны изучить использование парсера bbcode (быстрый поиск по поисковой сети http: //bbcode.codeplex.com/) –