2010-08-20 4 views
1

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

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 не выделяется в данном образце текста.

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

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

ответ

3

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

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

(?<!\w) 

Вы могли бы также проверить на что-либо, что не непробельный характер, например, так:

(?<!\S) 

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

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

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

(?<=\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|$)"; 
+0

Спасибо за ур ответ. Pl предлагает мне, что мне нужно в этом сценарии. Также мне нужно совместить точное слово. – Chakri

+0

Привет, Chakri, я просто редактировал, чтобы добавить фактический пример - это уже сделано. Дайте мне знать, если будет более подробная информация. –

+0

Привет, Питер, я попробовал код, предложенный u. если ключевое слово .net - это начало текста, оно не выделяется. Пример текста. Основы программирования .net. Если .net не находится в начальной позиции, тогда он становится подсвеченным. Pl помогите мне. – Chakri

Смежные вопросы