Выделите ключевые слова в данном тексте поиска - PullRequest
1 голос
/ 20 августа 2010

Я использую следующий метод для выделения ключевых слов в данном тексте.

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>");

        }

Пример текста: «Что такое программирование .net? Pl предлагает несколько электронных книг»

Ключевое слово: ".net"

Когда я пытаюсь выполнить поиск по ключевому слову ".net", .net не выделяется в данном примере текста.

Когда я пытаюсь выполнить поиск по ключевому слову "электронные книги", электронные книги выделяются в данном примере текста.

В чем будет проблема. Может кто-нибудь PL, дайте мне знать, где именно мне нужно изменить /

1 Ответ

3 голосов
/ 20 августа 2010

Перед словом ".net" нет границы слова, потому что \b ищет только изменение между \w и \W, и оба . и (пробел) попадают в категорию \W, поэтому между ними нет границы.

Один из вариантов - просто искать «не слово-символ», то есть не проверять явно границу, а только отсутствие символа слова, используя отрицательный знакlookbehind:

(?<!\w)

Вы также можете проверить наличие любых символов, не являющихся пробельными символами, например:

(?<!\S)

Это двойное отрицание - может показаться более очевиднымсделайте (?<=\s) (или (?<=\W) для предыдущего примера), но это предотвратит совпадения совпадений в начале строки.

Для примера различия между этими двумя - первый совпадет с.NET в C#.NET, тогда как второй не будет.

Поскольку вы используете регулярное выражение .NET, к счастью, вы получили достаточно полный набор функций регулярного выражения - но стоит отметить, что некоторые другие реализации регулярных выраженийОтношения не поддерживают отрицательный взгляд назад - для них вам необходимо использовать синтаксис, подобный следующему:

(?<=\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|$)";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...