C# 突出显示给定搜索文本中的关键字

C# 突出显示给定搜索文本中的关键字,c#,regex,C#,Regex,我使用以下方法突出显示给定文本中的关键字 private string HighlightSearchKeyWords(string searchKeyWord, string text) { Regex keywordExp = new Regex(@" ?, ?"); var pattern = @"\b(" + keywordExp.Replace(Regex.Escape(searchKeyWord), @"|") + @"

我使用以下方法突出显示给定文本中的关键字

private string HighlightSearchKeyWords(string searchKeyWord, string text)
        {
            Regex keywordExp = new Regex(@" ?, ?");
            var pattern = @"\b(" + keywordExp.Replace(Regex.Escape(searchKeyWord), @"|") + @")\b";
            Regex exp = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline);
            return exp.Replace(text, @"<span class=""search-highlight"">$0</span>");

        }
私有字符串HighlightSearchKeyWords(字符串搜索关键字,字符串文本)
{
Regex关键字exp=新的Regex(@“,?”);
变量模式=@“\b(“+keywordExp.Replace(Regex.Escape(searchKeyWord),@“|”+@”)\b”;
Regex exp=new Regex(模式,RegexOptions.IgnoreCase | RegexOptions.Singleline);
返回exp.Replace(文本@“$0”);
}
示例文本:“什么是.net编程?Pl推荐几本电子书”

关键词:“.net”

当我尝试使用关键字“.net”进行搜索时,给定的示例文本中没有突出显示“.net”

当我尝试用关键字“电子书”搜索时,电子书在给定的示例文本中突出显示


问题是什么。有人能告诉我需要修改的确切位置吗?

在“.net”之前没有单词边界,因为
\b
只查找
\w
\w
之间的变化,而
(空格)都属于
\w
类别,因此它们之间没有边界

一种选择是简单地查找“非单词字符”-即不显式检查边界,仅检查缺少单词字符,使用负查找:

(?<!\w)
(在所有这些情况下,您都希望另一端具有同等的前瞻性。)

以下是这四种变体在您的模式中的外观:

var pattern = @"(?<!\w)(" + keywordExp.Replace(Regex.Escape(searchKeyWord), @"|") + @")(?!\w)";
var pattern = @"(?<!\S)(" + keywordExp.Replace(Regex.Escape(searchKeyWord), @"|") + @")(?!\S)";
var pattern = @"(?<=\s|^)(" + keywordExp.Replace(Regex.Escape(searchKeyWord), @"|") + @")(?=\s|$)";
var pattern = @"(?<=\W|^)(" + keywordExp.Replace(Regex.Escape(searchKeyWord), @"|") + @")(?=\W|$)";

var模式=@”(?谢谢你的回答。Pl建议我在这个场景中需要做什么。我还需要匹配确切的单词。嗨,查克里,我刚刚编辑添加了一个实际的例子-现在已经完成了。让我知道更多的细节是否会有帮助。嗨,彼得,我尝试了你建议的代码。如果关键字.net是文本开头的,那么它就不高了hlighting.Sample Text:.net编程基础知识。如果.net不在起始位置,那么它将被突出显示。Pl帮助我。啊,对不起,我应该考虑到这一点!简单的解决方案是添加
| ^
,但我会用更多细节更新答案。好的,希望这次答案更清晰,在所有情况下都有效,但让我来看看我不知道我还错过了什么。
(?<=\W|^)
(?<=\s|^)
var pattern = @"(?<!\w)(" + keywordExp.Replace(Regex.Escape(searchKeyWord), @"|") + @")(?!\w)";
var pattern = @"(?<!\S)(" + keywordExp.Replace(Regex.Escape(searchKeyWord), @"|") + @")(?!\S)";
var pattern = @"(?<=\s|^)(" + keywordExp.Replace(Regex.Escape(searchKeyWord), @"|") + @")(?=\s|$)";
var pattern = @"(?<=\W|^)(" + keywordExp.Replace(Regex.Escape(searchKeyWord), @"|") + @")(?=\W|$)";