C # Regex заменитьили [br /] в "\ n" между [pre = html] кодом [br /] code [/ pre] - PullRequest
3 голосов
/ 17 июля 2011

У меня есть этот код, который заменяет BBCode на html, проблема возникает, когда я хочу заменить теги <br /> или [br /], которые находятся в пределах [pre=html] code [/pre].

<code>Regex exp; string str;

 str = "more text [pre=html] code code code code [br /] code code code [br /] code code [/pre] more text";

 str = str.Replace("[br /]","<br />");

 exp = new Regex(@"\[b\](.+?)\[/b\]");
 exp.Replace str = (str,"<strong>$1</strong>");
 ......
 exp = new Regex (@ "\[pre\=([a-z\]]+)\]([\d\D\n^]+?)\[/pre\]");
 str = exp.Replace(str, "<pre class=\"$1\">" + "$2" + "
");

Как вы могли бы изменить <br /> или [br /] на "\ n", которые находятся в пределах [pre=html] code [/pre] или <pre class=html> code </pre>

1 Ответ

5 голосов
/ 17 июля 2011

Как правило, почти невозможно выразить ограничение, согласно которому что-то должно совпадать, только если оно находится между соответствующей парой чего-то другого в одном регулярном выражении.

Проще разделить это на несколько операций,где вы сначала находите блоки [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 'Мне придется изменить его по мере необходимости, чтобы выполнить дальнейшую обработку, но я думаю, что это поможет вам начать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...