首页 > 解决方案 > 查找和替换文本,同时保持匹配的文本 CaSe

问题描述

我在一个网站上有简单的功能,用户输入要搜索的关键字,匹配的关键字被包裹起来,匹配的关键字<span></span>的颜色也会改变。

下面的代码查找并替换标题中找到匹配项的关键字,但更改匹配项的大小写会根据输入关键字的方式而改变。

protected String getTitle(object title)
{
    string sTitle = title.ToString();

    Regex regex = null;
    string pattern = @"(\b(?:" + _Keyword.ToString().Trim() + @")\b)(?![^<]*?>)";
    regex = new Regex(pattern,RegexOptions.IgnoreCase);
    sTitle = regex.Replace(sTitle, "<span class='keyword-highlight'>" + _Keyword + "</span>");
    return sTitle;
}

实际文本 =Trump asked Australia to help investigate Mueller 搜索关键字 =australia

假设我australia在这种情况下输入了小写的关键字,它会找到匹配项并将其替换为语法错误的匹配Australia项,australia因为我希望将文本大小写与实际句子中的内容保持一致。

结果 =Trump asked australia to help investigate Mueller

如何在上面的代码中进行此更改,如果我删除RegexOptions.IgnoreCase则它将不匹配,因为现在搜索关键字是 CaSe SenSiTive

标签: c#regex

解决方案


只需使用$1(第一个捕获的组)

替换编号组

language 元素包括替换字符串中与 number 捕获组匹配的$number最后一个子字符串,其中 number 是捕获组的索引。

例子

var input = "Trump asked Australia to help investigate Mueller";
var keyword = "australia"; 

var pattern = @"(\b(?:" + keyword.Trim() + @")\b)(?![^<]*?>)";
var result = Regex.Replace(input, pattern, "<span class='keyword-highlight'>$1</span>", RegexOptions.IgnoreCase);

Console.WriteLine(result);

输出

Trump asked <span class='keyword-highlight'>Australia</span> to help investigate Mueller

推荐阅读