Как правило, почти невозможно выразить ограничение, согласно которому что-то должно совпадать, только если оно находится между соответствующей парой чего-то другого в одном регулярном выражении.
Проще разделить это на несколько операций,где вы сначала находите блоки [pre]
, а затем обрабатываете их содержимое отдельно.Это облегчает написание, понимание и отладку вашего кода.
Вот пример того, как этого добиться:
<code>static string ReplaceBreaks(string value)
{
return Regex.Replace(value, @"(<br */>)|(\[br */\])", "\n");
}
static string ProcessCodeBlocks(string value)
{
StringBuilder result = new StringBuilder();
Match m = Regex.Match(value, @"\[pre=(?<lang>[a-z]+)\](?<code>.*?)\[/pre\]");
int index = 0;
while( m.Success )
{
if( m.Index > index )
result.Append(value, index, m.Index - index);
result.AppendFormat("<pre class=\"{0}\">", m.Groups["lang"].Value);
result.Append(ReplaceBreaks(m.Groups["code"].Value));
result.Append("
"); index = m.Index + m.Length; m= m.NextMatch ();} if (index
You 'Мне придется изменить его по мере необходимости, чтобы выполнить дальнейшую обработку, но я думаю, что это поможет вам начать работу.