c#正则表达式在[pre = html]代码[br /]代码[/ pre]之间替换<br/>或[br /]到“\ n”

时间:2011-07-17 00:18:15

标签: c# asp.net-mvc regex replace

我有这个代码将BBCode替换为html,当我想要替换<br />内的标记[br /][pre=html] code [/pre]时会出现问题。

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" + "</pre>");

您要在<br />[br /]

范围内更改[pre=html] code [/pre]<pre class=html> code </pre>以及“{n}”

1 个答案:

答案 0 :(得分:5)

一般来说,几乎不可能表达一种限制,即如果某个东西必须匹配在一个正则表达式中匹配的其他东西之间。

将其拆分为多个操作会更容易,您首先找到[pre]块,然后分别处理它们的内容。它使您的代码更易于编写,理解和调试。

以下是如何完成此操作的示例:

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("</pre>");

        index = m.Index + m.Length;
        m = m.NextMatch();
    }

    if( index < value.Length )
        result.Append(value, index, value.Length - index);

    return result.ToString();
}

您需要根据需要对其进行修改以执行进一步处理,但我认为这会让您入门。