2010-08-05 18 views
6

Sto usando i seguenti 2 metodi per evidenziare le parole chiave di ricerca. Funziona bene ma anche le parole parziali.Espressione regolare per abbinare la parola esatta - Evidenziazione stringa di ricerca

Per esempio:

testo: "Questo è .net Programmazione" Ricerca Parola chiave: "è"

Si sta mettendo in luce parola parziale ° è e "è"

Per favore fatemi sapere l'espressione regolare corretta per evidenziare la corrispondenza corretta.

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 
} 

risposta

6

È davvero solo bisogno @ prima del tuo "(\ b" e "\ b)" perché la stringa "\ b" non sarà "\ b "come ti aspetteresti. Ma ho anche provato a creare un'altra versione con un pattern di sostituzione invece di un metodo completo.

Che ne dite di questo:

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

Usage:

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

Risultato:

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

Aggiornato da usare \ b ed un semplificato sostituire modello. (Il vecchio usato (^ | \ s) invece dei primi \ b e ($ | \ s) invece dell'ultimo \ b, quindi funzionerebbe anche sui termini di ricerca che non includono solo caratteri di parola

aggiornato alla notazione virgola per i termini di ricerca

aggiornato dimenticato Regex.Escape - ha aggiunto la società Altrimenti le ricerche per "\ w" sarebbe far saltare in aria la cosa :)

aggiornato fare per una. commento;)

+0

Grazie .. funziona perfettamente. – stackuser1

+0

Invece di cosa? ha una notazione, quindi le parole chiave dovrebbero essere suddivise come: "\ bthis | is \ b". –

+1

stackuser1 -> :) Ma vedi il mio ultimo aggiornamento. Scappare i dati di input è davvero importante per fare altrimenti i tuoi utenti possono rompere la cosa:/ –

1

Prova questa rete fissa:

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

Grazie mille.lavoro fine – stackuser1

1

Yo È necessario includere le parole chiave in un gruppo non corrispondente, altrimenti si otterranno i falsi positivi (se si utilizzano più parole chiave separate da virgole come indicato nell'esempio)!

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

Prova questo: HighlightSearchKeyWords ("blah ,, is", "Questo è. NET Programming.");) Un sacco di span. Devi rimuovere le entità vuote. –

+0

+1 Grazie per aver evidenziato alcuni problemi nel mio codice a cui si mostra una soluzione. –

+0

@lasseespeholt: hai ragione. Gli spazi bianchi non dovrebbero essere consentiti. La soluzione è banale. –

Problemi correlati