788*_*498 3 c# regex asp.net-mvc 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>");
Run Code Online (Sandbox Code Playgroud)
正如您要更改<br />或[br /]使用"\n"内部[pre=html] code [/pre]或<pre class=html> code </pre>
一般来说,几乎不可能表达一种限制,即如果某个东西必须匹配在一个正则表达式中匹配的其他东西之间.
将其拆分为多个操作会更容易,您首先找到[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();
}
Run Code Online (Sandbox Code Playgroud)
您需要根据需要对其进行修改以执行进一步处理,但我认为这将帮助您入门.