2010-08-20 109 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在給定的示例文本中未突出顯示。

當我嘗試使用關鍵字「電子書」進行搜索時,電子書在給出的示例文本中變得突出顯示。

會是什麼問題。誰能PL讓我知道哪兒我需要修改/

回答

3

沒有單詞邊界之前的「.NET」,因爲\b只查找\w\W之間的變化,都.(空間)落入\W類別,所以它們之間沒有邊界。

一種選擇是簡單地尋找「不是一個字字符」 - 即沒有明確檢查的邊界,只爲缺乏一個字字符,使用負回顧後:

(?<!\w) 

你可以還檢查什麼,這不是一個非空白字符,像這樣:

(?<!\S) 

這一個是雙負 - 這似乎更加明顯做(?<=\s)(或(?<=\W)對於前面的例子),但這些將防止比賽在開始o f線從匹配。

有關這兩者之間差異的示例 - 第一個匹配.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|$)"; 
+0

感謝您的回答。 Pl建議我在這種情況下需要什麼。 另外我需要匹配確切的單詞。 – Chakri 2010-08-20 11:48:37

+0

嗨Chakri,我只是編輯添加一個實際的例子 - 現在就完成了。讓我知道是否有更多的細節會有所幫助。 – 2010-08-20 11:50:57

+0

嗨,彼得,我嘗試了你所建議的代碼。如果關鍵字.net是在文本的開始,那麼它不會突出顯示。 示例文本:.net編程基礎知識。 如果.net不在起始位置,則會突出顯示。 Pl幫助我。 – Chakri 2010-08-20 12:32:17