2014-04-11 22 views
5

Come posso trovare tutte le corrispondenze in una stringa utilizzando un'espressione regolare eseguita in C#?C# Regex corrisponde più parole in una stringa

Desidero trovare tutte le corrispondenze nella stringa di esempio seguente. Esempio:

inputString: Hello (mail) byebye (time) how are you (mail) how are you (time) 

voglio abbinare (mail) e (time) dall'esempio. Comprese parentesi ( e ).

Nel tentativo di risolvere questo problema, ho scritto il seguente codice.

string testString = @"(mail)|(time)"; 

Regex regx = new Regex(Regex.Escape(testString), RegexOptions.IgnoreCase); 
List<string> mactches = regx.Matches(inputString).OfType<Match>().Select(m => m.Value).Distinct().ToList(); 

foreach (string match in mactches) 
{ 
    //Do something 
} 

è il tubo (|) utilizzato per la logica OR condizione?

risposta

6

Utilizzando Regex.Escape(testString) sta per sfuggire al tuo carattere pipe, girando

@"(mail)|(time)" 

efficacemente in

@"\(mail\)\|\(time\)". 

Così, il vostro regex sta cercando letterale "(mail)|(time)".

Se tutte le partite sono semplici come parole circondate da parentesi, vorrei costruire l'espressione regolare in questo modo:

List<string> words = new List<string> { "(mail)", "(time)", ... }; 
string  pattern = string.Join("|", words.Select(w => Regex.Escape(w))); 
Regex  regex = new Regex(pattern, RegexOptions.IgnoreCase); 
+0

PERFETTO !!!! @FishBasketGordo – Nisho

3

sfuggire alla parentesi nella stringa di prova:

string testString = @"\(mail\)|\(time\)"; 

Rimuovere Regex.Escape :

Regex regx = new Regex(testString, RegexOptions.IgnoreCase); 

Uscita (include pare ntheses):

(mail) 
(time) 

Il motivo Regex.Escape non funziona nel tuo caso è che sfugge il carattere | così:

sfugge un insieme minimo di metacaratteri (\, *, +, ?, |, {, [, (,), ^, $,., #, and whitespace) sostituendoli con i loro \ codici.

+0

Wow ... corretto. ma perché è l'uso di Fuga di? perché voglio costruire l'testString dinamicamente da un elenco di parole, ad esempio: (posta) (tempo) (questo) (che) Pensavo di poter sfuggire loro useing il Regex.Escape. Strano! @Grant Winney – Nisho

+1

Penso che finisca per sfuggire anche al tuo carattere '| –

+1

@Nisho, usa 'Escape' in qualsiasi modo, qualcosa come' String.Join ("|", myListOfWords.Select (Regex.Escape)) '. – decPL

Problemi correlati