2010-08-05 3 views
6

J'utilise les 2 méthodes suivantes pour mettre en évidence les mots-clés de recherche. Cela fonctionne bien mais aussi chercher des mots partiels.Expression régulière pour correspondre mot exact - chaîne de recherche Mettez en surbrillance

Par exemple:

texte: "Ceci est la programmation .net" Recherche mot clé: "est"

Il met en avant mot partiel de e est et "est"

S'il vous plaît laissez-moi savoir l'expression régulière correcte pour mettre en évidence la correspondance correcte.

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 
} 

Répondre

6

Vous avez vraiment juste besoin @ avant "(\ b" et "\ b)" parce que la chaîne "\ b" ne sera pas « \ b "comme vous vous y attendriez. Mais j'ai également essayé de faire une autre version avec un modèle de remplacement au lieu d'une méthode à part entière.

Que diriez-vous celui-ci:

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

Utilisation:

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

Résultat:

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

Mise à jour utiliser \ b et simplifié remplacer motif. (L'ancien utilisait (^ | \ s) à la place du premier \ b et ($ | \ s) au lieu du dernier \ b. Il fonctionnerait donc aussi sur les termes de recherche qui incluent non seulement des caractères-mots

Mise à jour à votre notation par des virgules pour les termes de recherche

Mise à jour oublièrent Regex.Escape - ajoutée Sinon recherches pour « \ w » ferait exploser la chose :)

Mise à jour à faire. commentaire;)

+0

Merci .. il fonctionne bien. – stackuser1

+0

Au lieu de quoi? il a une notation, ainsi les mots-clés devraient être séparés comme: "\ bthis | is \ b". –

+1

stackuser1 -> :) Mais voir ma dernière mise à jour. Il est très important de s'échapper des données d'entrée, sinon vos utilisateurs peuvent casser la chose:/ –

1

Essayez cette ligne fixe:

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

Merci beaucoup.travailler bien – stackuser1

1

Yo Vous devez inclure les mots-clés dans un groupe sans correspondance, sinon vous obtiendrez faux positifs (si vous utilisez plusieurs mots-clés séparés par des virgules comme indiqué dans l'exemple)!

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

Essayez celui-ci: HighlightSearchKeyWords ("blah ,, is", "Ceci est la programmation .net.");) Beaucoup de travées. Vous devez supprimer les entités vides. –

+0

+1 Merci d'avoir mis en évidence certains problèmes dans mon code auxquels vous montrez une solution. –

+0

@lasseespeholt: Vous avez raison. Les espaces blancs ne devraient pas être autorisés. La solution est triviale. –

Questions connexes