2010-11-09 10 views
9

Come posso cercare una corrispondenza esatta in una stringa? Per esempio, se ho avuto una stringa con questo testo:C# trova corrispondenza esatta nella stringa

etichetta
etichetta:
etichette

E cerco etichetta, voglio solo ottenere la prima partita, non gli altri due. Ho provato il metodo Contains e IndexOf, ma mi hanno anche dato il 2 ° e il 3 ° match.

+0

perché non basta controllare 'str ==" label "'? –

+1

cerca la parola "whole word" .. :) –

+1

@ Wizard Shadow: oh, ok. –

risposta

18

È possibile utilizzare un'espressione regolare come questo:

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

L'\ b è un controllo di confine di parola, e utilizzato come sopra di esso sarà in grado di soddisfare solo parole intere.

Io penso la versione regex dovrebbe essere più veloce di LINQ.

Reference

+0

Per qualche motivo, questo non ha funzionato. È sempre risultato vero, non importa quello che ho scritto. – david

+0

Devi aver fatto qualcosa di sbagliato perché l'ho controllato e funziona perfettamente. Forse potresti pubblicare il codice che dici che restituisce sempre true. –

+0

Ok, quindi apparentemente string reg = (@ "\ bHello \ b"); funziona ma string reg = (@ "\ b" + etichetta + @ "\ b"); non. Perché è così e come posso risolverlo? – david

1

Si potrebbe provare una versione di LINQ:

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

Sembra funzionare, grazie. – david

3

Si può cercare di dividere la stringa (in questo caso il separatore di destra può essere lo spazio ma dipende dal caso) e dopo è possibile utilizzare il metodo equals per vedere se c'è la partita ad esempio:

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

E l'uso può essere

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

Sembra che hai un delimitatore (CRLF) tra le parole in modo si potrebbe includere il delimitatore come parte della stringa di ricerca.

In caso contrario, andrei con il suggerimento di Liviu.