2010-08-05 23 views
6

Estoy utilizando los siguientes 2 métodos para resaltar las palabras clave de búsqueda. Está funcionando bien, pero también trae palabras parciales.Expresión regular para coincidir con la palabra exacta - Resaltar cadena de búsqueda

Por ejemplo:

texto: "Esta es la programación .net" Búsqueda Palabra clave: "es"

Es de destacar palabra parcial de Th es y "es"

Por favor, hágame saber la expresión regular correcta para resaltar la coincidencia correcta.

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 
} 

Respuesta

6

Usted realmente sólo necesita @ antes de "(\ b" y "\ b)" debido a que la cadena "\ b" no será "\ b "como es de esperar" Pero también intenté hacer otra versión con un patrón de reemplazo en lugar de un método en toda regla.

¿Qué tal este:

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

Uso:

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

Resultado:

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

Actualizado utilizar \ b y una simplificado patrón de sustitución. (El anterior usaba (^ | \ s) en lugar de los primeros \ b y ($ | \ s) en lugar de los últimos \ b. Por lo tanto, también funcionaría en los términos de búsqueda que no solo incluye caracteres de palabra.

Actualizado a su notación de coma para términos de búsqueda

Actualizado olvidó Regex.Escape - añadió de lo contrario, ahora las búsquedas de "\ w", harían estallar la cosa :)

Actualizado hacer a una. comentario;)

+0

Gracias ... funciona bien. – stackuser1

+0

¿En lugar de qué? tiene una notación para que las palabras clave se dividan como: "\ bthis | is \ b". –

+1

stackuser1 -> :) Pero mira mi última actualización. Escapar los datos de entrada es realmente importante, de lo contrario sus usuarios pueden romperlo:/ –

1

probar este línea fija:

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

Gracias much.working fine – stackuser1

1

Yo debe encerrar las palabras clave en un grupo no coincidente, de lo contrario recibirá falsos positivos (¡si usa varias palabras clave separadas por comas como se indica en la muestra)!

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

Pruebe este: HighlightSearchKeyWords ("blah ,, is", "Esto es .NET Programming.");) Muchos intervalos. Debes eliminar las entidades vacías. –

+0

+1 Gracias por destacar algunos problemas en mi código para los que muestra una solución. –

+0

@lasseespeholt: tienes razón. Los espacios en blanco no deben ser permitidos. La solución es trivial. –

Cuestiones relacionadas