在C#开发的实际场景中,经常需要实现文本检索功能,要求检索时忽略大小写差异,同时将匹配到的内容以高亮形式展示,方便用户快速识别目标内容。下面我们就来一步步实现这个功能。

核心实现思路
整个功能的实现分为两个核心步骤:第一步是进行不区分大小写的字符串匹配,找到检索关键词在目标文本中的所有出现位置;第二步是对这些匹配到的位置添加高亮标记,通常使用HTML的<span>标签配合样式实现高亮效果。
不区分大小写匹配的方法
C#中可以通过StringComparison.OrdinalIgnoreCase枚举值来指定字符串比较时忽略大小写,也可以使用正则表达式的RegexOptions.IgnoreCase选项来实现不区分大小写的匹配,后者更适合获取所有匹配位置的需求。
高亮标记的实现逻辑
获取到所有匹配到的起始索引和长度后,我们可以遍历这些匹配项,在目标文本中对应位置插入高亮标签,需要注意处理多个匹配项重叠或者顺序的问题,避免标签嵌套错误。
完整代码示例
下面是一个封装好的工具类,包含不区分大小写检索并高亮的方法,可以直接复用:
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
public class SearchHighlightHelper
{
/// <summary>
/// 不区分大小写检索并高亮显示匹配内容
/// </summary>
/// <param name="sourceText">原始文本</param>
/// <param name="keyword">检索关键词</param>
/// <param name="highlightClass">高亮样式类名</param>
/// <returns>带高亮标记的文本</returns>
public static string HighlightKeywordIgnoreCase(string sourceText, string keyword, string highlightClass = "highlight")
{
// 如果原始文本或关键词为空,直接返回原始文本
if (string.IsNullOrEmpty(sourceText) || string.IsNullOrEmpty(keyword))
{
return sourceText;
}
// 构建正则表达式,使用IgnoreCase选项实现不区分大小写匹配
Regex regex = new Regex(Regex.Escape(keyword), RegexOptions.IgnoreCase);
// 获取所有匹配项
MatchCollection matches = regex.Matches(sourceText);
// 如果没有匹配项,直接返回原始文本
if (matches.Count == 0)
{
return sourceText;
}
StringBuilder result = new StringBuilder();
int lastIndex = 0;
foreach (Match match in matches)
{
// 添加匹配位置之前的文本
result.Append(sourceText.Substring(lastIndex, match.Index - lastIndex));
// 添加带高亮标记的关键词
result.Append($"<span class="{highlightClass}">{match.Value}</span>");
lastIndex = match.Index + match.Length;
}
// 添加最后一段剩余文本
if (lastIndex < sourceText.Length)
{
result.Append(sourceText.Substring(lastIndex));
}
return result.ToString();
}
}
使用示例
我们可以在控制台或者Web项目中调用上面的方法,以下是控制台的使用示例:
class Program
{
static void Main(string[] args)
{
string source = "Hello World, hello C#,HELLO everyone";
string keyword = "hello";
string highlightedText = SearchHighlightHelper.HighlightKeywordIgnoreCase(source, keyword);
Console.WriteLine("原始文本:" + source);
Console.WriteLine("高亮后文本:" + highlightedText);
}
}
如果是在Web项目中使用,只需要定义对应的CSS样式即可实现高亮效果,例如:
.highlight {
color: #ff0000;
font-weight: bold;
background-color: yellow;
}
注意事项
- 如果检索关键词包含正则表达式特殊字符,需要使用
Regex.Escape方法进行转义,避免正则匹配异常,示例代码中已经做了这个处理。 - 高亮标记的标签可以根据实际需求调整,比如使用
<em>标签或者其他自定义标签。 - 如果需要处理大量文本的检索高亮,建议提前做好性能优化,避免频繁的字符串拼接操作。