asp.net regex.replace()

时间:2010-09-12 06:49:28

标签: c# regex

我有以下代码首先删除html标记,然后在结果文本中突出显示搜索词:

protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    try
    {
        // get search value query string
        string searchText = Request.QueryString["search"].Trim();
        string encodedValue = Server.HtmlEncode(searchText);

        Literal Content = e.Item.FindControl("Content") as Literal;
        string contentText = Content.Text;
        Content.Text = Regex.Replace(contentText, @"<(.|\n)*?>", string.Empty).Replace(encodedValue, "<font class='highlight2'>" + encodedValue + "</font>");
    }
    catch
    {
        // do nothing
    }
}

这在一定程度上起作用,但第二个替换不是不区分大小写的。我怎么能用regex.replace()做第二次替换,所以区分大小写不是问题?谢谢!

2 个答案:

答案 0 :(得分:2)

使用this overload获取RegexOptions。你会想要IgnoreCase值。

答案 1 :(得分:2)

首先让我们谈谈您用来删除标记的正则表达式<(.|\n)*?>。如果您希望点匹配任何包括换行符,则应使用单线模式。它在某些风格中也被称为DOTALL模式,因为它的作用是:允许点匹配换行符。您可以使用RegexOptions.Singleline标志,或使用内联修饰符将其嵌入到正则表达式中:

`(?s)<.*?>`

这仍然非常脆弱,但是我会留下它,因为没有办法让它变得无懈可击;正则表达式和HTML从根本上是不兼容的。

至于第二次替换,你需要做的第一件事是打破那些链式方法调用 - 实际上,我会说他们永远不应该被链接。将Regex.Replace的结果直接提供给String.Replace要么是错误要么是过于聪明。在任何一种情况下,如果你想两次调用Regex.Replace,你将它们分开。

您还需要在搜索表达式中转义任何正则表达式元字符,假设您仍想要进行文字搜索而不是正则表达式搜索。你可以使用Escape方法。

string searchText = Request.QueryString["search"].Trim();
string encodedValue = Server.HtmlEncode(searchText);
string escapedValue = Regex.Escape(encodedValue);

string contentText = Content.Text;
contentText = Regex.Replace(contentText, @"(?s)<.*?>", string.Empty);
contentText = Regex.Replace(contentText, escapedValue, 
    "<font class='highlight2'>$&</font>", RegexOptions.IgnoreCase);
Content.Text = contentText;

您的代码中有一些其他内容对我来说似乎并不合适(例如为什么您似乎永久删除了所有标记),但我正在努力专注于您的实际问题。为此,我尝试在代码中进行必要的最小更改以说明我的答案。但我还有一件事要评论:

catch
{
    // do nothing
}

不要那样做。至少,向控制台发送错误消息或重新抛出要处理的调用代码的异常,但永远默默地吞下它们。