He usado .Contains() para encontrar si una oración contiene una palabra específica, sin embargo, encontré algo extraño:
Quería saber si la palabra "hola" estaba presente en una oración que es la siguiente:
El niño quería jugar en el barro.
hola
Héctor tenía un problema de cadera
if(sentence.contains("hi")) { // }Solo quiero que se filtre la SEGUNDA oración, sin embargo, las 3 se filtran ya que CHILD tiene un 'hola' y hip tiene un 'hola'. ¿Cómo uso .Contains() de modo que solo se seleccionen palabras completas?
Intenta usar expresiones regulares:
if (Regex.Match(sentence, @"\bhi\b", RegexOptions.IgnoreCase).Success) { // };Esto funciona bien para mí en su texto de entrada.
Aquí hay una solución Regex:
Regex tiene un ancla de límite de palabra usando \b
Además, si la cadena de búsqueda puede provenir de la entrada del usuario, podría considerar escapar de la cadena usando Regex.Escape
Este ejemplo debería filtrar una lista de cadenas de la forma que desee.
string findme = "hi"; string pattern = @"\b" + Regex.Escape(findme) + @"\b"; Regex re = new Regex(pattern,RegexOptions.IgnoreCase); List<string> data = new List<string> { "The child wanted to play in the mud", "Hi there", "Hector had a hip problem" }; var filtered = data.Where(d => re.IsMatch(d));Puede dividir su oración en palabras: puede dividir en cada espacio y luego recortar cualquier puntuación. Luego verifica si alguna de estas palabras es 'hola':
var punctuation = source.Where(Char.IsPunctuation).Distinct().ToArray(); var words = sentence.Split().Select(x => x.Trim(punctuation)); var containsHi = words.Contains("hi", StringComparer.OrdinalIgnoreCase);Vea una demostración funcional aquí: https://dotnetfiddle.net/AomXWx