2011-11-24 14 views
6

stavo attraversando questa domanda C#, Regex.Match whole wordsEspressione Regex per far corrispondere l'intera parola con caratteri speciali non funzionanti?

Dice per partita parola intera usare "\ bpattern \ b" Questo funziona bene per la partita parola intera senza caratteri speciali dal momento che è destinato solo per i caratteri di parola!

Ho bisogno di un'espressione per abbinare anche parole con caratteri speciali. Il mio codice è il seguente

class Program 
{ 
    static void Main(string[] args) 
    { 
     string str = Regex.Escape("Hi temp% dkfsfdf hi"); 
     string pattern = Regex.Escape("temp%"); 
     var matches = Regex.Matches(str, "\\b" + pattern + "\\b" , RegexOptions.IgnoreCase); 
     int count = matches.Count; 
    } 
} 

Ma non riesce a causa di%. Abbiamo qualche soluzione per questo? Ci possono essere altri caratteri speciali come 'spazio', '(', ')', ecc

risposta

3

Se il modello può contenere caratteri che sono speciali per Regex, eseguirlo tramite Regex.Escape prima.

Questo è stato fatto, ma fare non sfuggire la stringa che si cerca attraverso - non è necessario.

+0

Vero, ma non il (solo) motivo del suo problema. –

5

Se si dispone di caratteri non di parole, non è possibile utilizzare \b. È possibile utilizzare il seguente

@"(?<=^|\s)" + pattern + @"(?=\s|$)" 

Edit: Come Tim accennato nei commenti, la vostra espressione regolare non riesce proprio a causa \b non riesce a corrispondere al confine tra % e lo spazio bianco accanto ad essa, perché entrambi sono non -word caratteri. \b corrisponde solo al confine tra il carattere della parola e un carattere diverso da una parola.

Vedere di più sui contorni delle parole here.

Spiegazione

@" 
(?<=  # Assert that the regex below can be matched, with the match ending at this position (positive lookbehind) 
       # Match either the regular expression below (attempting the next alternative only if this one fails) 
    ^   # Assert position at the beginning of the string 
    |   # Or match regular expression number 2 below (the entire group fails if this one fails to match) 
     \s   # Match a single character that is a “whitespace character” (spaces, tabs, and line breaks) 
) 
temp%  # Match the characters “temp%” literally 
(?=   # Assert that the regex below can be matched, starting at this position (positive lookahead) 
       # Match either the regular expression below (attempting the next alternative only if this one fails) 
     \s   # Match a single character that is a “whitespace character” (spaces, tabs, and line breaks) 
    |   # Or match regular expression number 2 below (the entire group fails if this one fails to match) 
     $   # Assert position at the end of the string (or before the line break at the end of the string, if any) 
) 
" 
+1

Più esattamente, se i caratteri non alfanumerici sono l'inizio o la fine della parola di ricerca, non è possibile utilizzare '\ b' perché quell'ancora corrisponde tra un carattere alnum e un carattere non alnum. –

+0

@Yadala - Semplicemente fantastico! È quasi lì tranne che ha un problema. Supponi che la stringa sia "Ciao, questo è stackoverflow" e il pattern è "this", quindi non ci sono corrispondenze. Ciò accade a causa di uno spazio vuoto dopo la stringa effettiva nel modello. Come possiamo gestire questo? Idealmente parlando dovrebbe dire una corrispondenza trovata! – GuruC

+0

@GuruC Se nella stringa di ricerca è presente uno spazio bianco, come può essere ancora la ricerca completa delle parole? Ho appena verificato questo in Notepad ++, se seleziono Ricerca parola intera e cerco "questo" in "Ciao questo è StackOverflow" .. non fornisce corrispondenze. –

1
output = Regex.Replace(output, "(?<!\w)-\w+", "") 
output = Regex.Replace(output, " -"".*?""", "") 
Problemi correlati