2010-08-05 13 views
6

Korzystam z następujących 2 metod, aby podświetlić wyszukiwane słowa kluczowe. Działa dobrze, ale pobiera również częściowe słowa.Wyrażenie regularne w celu dopasowania dokładnego słowa - wyróżnienie ciągu wyszukiwania

na przykład:

Tekst: "To jest .net Programowanie" Search Key Słowo: "jest"

Jest podkreślając częściowe słowo z th jest a "jest"

Proszę dać mi znać prawidłowe wyrażenie regularne, aby podświetlić poprawne dopasowanie.

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 
} 

Odpowiedz

6

Naprawdę wystarczy @ przed "(\ b" i "\ b)", ponieważ ciąg "\ b" nie będzie „\ b "jak można się spodziewać. Ale próbowałem także stworzyć inną wersję z zamiennym wzorem zamiast metodą pełną.

Jak o tym jednym:

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

Zastosowanie:

var res = HighlightSearchKeyWords("is,this", "Is this programming? This is .net Programming."); 

Wynik:

<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. 

Updated używać \ b i zastąpić uproszczony wzór. (Stary używał (^ | \ s) zamiast pierwszego \ bi ($ | \ s) zamiast ostatniego \ b. Tak więc działałby również na wyszukiwane terminy, które nie tylko zawierają znaki słowne.

Updated do notacji przecinkami dla wyszukiwanych haseł

Updated zapomniał Regex.Escape - dodał teraz inaczej wyszukiwania dla "\ w" byłoby wysadzić rzeczy :)

Updated zrobić, aby. komentarz;)

+0

Dzięki .. działa dobrze. – stackuser1

+0

Zamiast czego? ma notację, więc słowa kluczowe powinny zostać podzielone w następujący sposób: "\ bthis | is \ b". –

+1

stackuser1 -> :) Ale zobacz moją ostatnią aktualizację. Uwalnianie danych wejściowych jest bardzo ważne, ponieważ w przeciwnym razie użytkownicy mogą je zepsuć:/ –

1

Spróbuj stacjonarnego:

searchKeyWord = @"(\b" + exp.Replace(searchKeyWord, @"|") + @"\b)"; 
+0

Wielkie dzięki. Dobrze się pracuje – stackuser1

1

Yo Musisz ująć słowa kluczowe w nie pasującą grupę, w przeciwnym razie uzyskasz fałszywych pozytywów (jeśli używasz wielu słów kluczowych oddzielonych przecinkami, jak wskazano w przykładzie)!

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>"); 
} 
+0

Wypróbuj ten: HighlightSearchKeyWords ("blah ,, is", "To jest .net Programming.");) Wiele rozpiętości. Musisz usunąć puste jednostki. –

+0

+1 Dziękuję za zaznaczenie pewnych problemów w moim kodzie, na który wyświetlasz rozwiązanie. –

+0

@lasseespeholt: Masz rację. Białe spacje nie powinny być dozwolone. Rozwiązanie jest trywialne. –

Powiązane problemy