Регулярное выражение для соответствия точному слову - подсветка строки поиска - PullRequest
6 голосов
/ 05 августа 2010

Я использую следующие 2 метода, чтобы выделить ключевые слова для поиска.Он работает нормально, но извлекает и частичные слова.

Например:

Текст: "Это программирование .net" Поиск по ключевому слову: "is"

Подсветкачастичное слово из th равно и "is"

Пожалуйста, дайте мне знать правильное регулярное выражение, чтобы выделить правильное совпадение.

private string HighlightSearchKeyWords(string searchKeyWord, string text)
{
    Regex exp = new Regex(@", ?");
    searchKeyWord = "(\b" + exp.Replace(searchKeyWord, @"|") + "\b)";
    exp = new Regex(searchKeyWord, RegexOptions.Singleline | RegexOptions.IgnoreCase);
    return exp.Replace(text, new MatchEvaluator(MatchEval));
}

private string MatchEval(Match match)
{
    if (match.Groups[1].Success)
    {
        return "<span class='search-highlight'>" + match.ToString() + "</span>";
    }
    return ""; //no match
}

Ответы [ 3 ]

6 голосов
/ 05 августа 2010

Вам действительно нужно @ перед вашими "(\ 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" взорвал бы вещь:)

Обновлено сделать с комментарием;)

1 голос
/ 05 августа 2010

Вам необходимо заключить ключевые слова в несоответствующую группу, в противном случае вы получите ложных срабатываний (если вы используете несколько ключевых слов, разделенных запятыми, как указано в примере)!

private string EscapeKeyWords(string searchKeyWord)
{
    string[] keyWords = searchKeyWord.Split(',');
    for (int i = 0; i < keyWords.Length; i++) keyWords[i] = Regex.Escape(keyWords[i].Trim());

    return String.Join("|", keyWords);
}

private string HighlightSearchKeyWords(string searchKeyWord, string text)
{
    searchKeyWord = @"(\b(?:" + EscapeKeyWords(searchKeyWord) + @")\b)";
    Regex exp = new Regex(searchKeyWord, RegexOptions.Singleline | RegexOptions.IgnoreCase);
    return exp.Replace(text, @"<span class=""search-highlight"">$0</span>");
}
1 голос
/ 05 августа 2010

Попробуйте эту фиксированную линию:

searchKeyWord = @"(\b" + exp.Replace(searchKeyWord, @"|") + @"\b)";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...