Вам действительно нужно @ перед вашими "(\ b" и "\ b)", потому что строка "\ b" не будет "\ b", как вы ожидаете. Но я также попытался сделать другую версию с шаблоном замены вместо полноценного метода.
Как насчет этого:
private string keywordPattern(string searchKeyword)
{
var keywords = searchKeyword.Split(',').Select(k => k.Trim()).Where(k => k != "").Select(k => Regex.Escape(k));
return @"\b(" + string.Join("|", keywords) + @")\b";
}
private string HighlightSearchKeyWords(string searchKeyword, string text)
{
var pattern = keywordPattern(searchKeyword);
Regex exp = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline);
return exp.Replace(text, @"<span class=""search-highlight"">$0</span>");
}
Использование:
var res = HighlightSearchKeyWords("is,this", "Is this programming? This is .net Programming.");
Результат:
<span class="search-highlight">Is</span> <span class="search-highlight">this</span> programming? <span class="search-highlight">This</span> <span class="search-highlight">is</span> .net Programming.
Обновлено для использования \ b и упрощенного шаблона замены. (Старый использовал (^ | \ s) вместо первых \ b и ($ | \ s) вместо последнего \ b. Поэтому он также будет работать с поисковыми терминами, которые включают не только слова-символы.
Обновлен до запятой для условий поиска
Обновлено забыл Regex.Escape - добавлено сейчас. В противном случае поиск "\ w" взорвал бы вещь:)
Обновлено сделать с комментарием;)