2010-11-09 25 views
9

¿Cómo puedo buscar una coincidencia exacta en una cadena? Por ejemplo, si tuviera una cadena con este texto:C# buscar partido exacto en la cadena

etiqueta
etiqueta:
etiquetas

y busco para el sello, lo único que quieren obtener el primer partido, no los otros dos. Probé el método Contiene e IndexOf, pero también me dieron el segundo y el tercer partido.

+0

¿por qué no se limita a marcar 'str ==" label "'? –

+1

él está buscando la búsqueda de "palabra completa" ... :) –

+1

@Shadow Wizard: oh, está bien. –

Respuesta

18

Se puede utilizar una expresión regular como esto:

bool contains = Regex.IsMatch("Hello1 Hello2", @"(^|\s)Hello(\s|$)"); // yields false 
bool contains = Regex.IsMatch("Hello1 Hello", @"(^|\s)Hello(\s|$)"); // yields true 

El \ b es un cheque límite de la palabra, y se utiliza como la de arriba será capaz de igualar sólo palabras completas.

I piensa la versión de expresiones regulares debe ser más rápida que Linq.

Reference

+0

Por alguna razón, esto no funcionó. Siempre cedió verdadero sin importar lo que escribí. – david

+0

Debes haber hecho algo mal porque lo revisé y funciona perfectamente. Tal vez podrías publicar el código que dices que siempre es verdadero. –

+0

Ok, así que aparentemente string reg = (@ "\ bHello \ b"); funciona pero string reg = (@ "\ b" + label + @ "\ b"); no. ¿Por qué es eso y cómo puedo solucionarlo? – david

1

Usted podría tratar de una versión de LINQ:

string str = "Hello1 Hello Hello2"; 
string another = "Hello"; 
string retVal = str.Split(" \n\r".ToCharArray(), StringSplitOptions.RemoveEmptyEntries) 
        .First(p => p .Equals(another)); 
+0

Esto parece funcionar, gracias. – david

3

se puede tratar de dividir la cadena (en este caso el separador adecuado puede ser el espacio, pero depende del caso) y después se puede utilizar el método equals para ver si hay por ejemplo el partido:

private Boolean findString(String baseString,String strinfToFind, String separator) 
{     
    foreach (String str in baseString.Split(separator.ToCharArray())) 
    { 
     if(str.Equals(strinfToFind)) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

Y el uso puede ser

findString("Label label Labels:", "label", " "); 
1

Parece que tiene un delimitador (crlf) entre las palabras para que pueda incluir el delimitador como parte de la cadena de búsqueda.

Si no, entonces seguiría con la sugerencia de Liviu.