2010-10-07 16 views
6

Non ho molta esperienza con RegEx, quindi sto utilizzando molte chiamate String.Replace() concatenate per rimuovere caratteri indesiderati - Esiste un RegEx che posso scrivere per semplificare questo?Regex per sostituire i caratteri non validi

string messyText = GetText(); 
string cleanText = messyText.Trim() 
     .ToUpper() 
     .Replace(",", "") 
     .Replace(":", "") 
     .Replace(".", "") 
     .Replace(";", "") 
     .Replace("/", "") 
     .Replace("\\", "") 
     .Replace("\n", "") 
     .Replace("\t", "") 
     .Replace("\r", "") 
     .Replace(Environment.NewLine, "") 
     .Replace(" ", ""); 

Grazie

+1

Anche se non è la convenzione di codifica preferita, se si inserisse ogni ".Replace()" su una nuova riga, sarebbe di aiuto la leggibilità su questo sito, quindi non ci sarebbe una grande scroll orizzontale. – Dinah

risposta

13

Prova questa espressione regolare:

Regex regex = new Regex(@"[\s,:.;/\\]+"); 
string cleanText = regex.Replace(messyText, "").ToUpper(); 

\s è una classe di caratteri pari a [ \t\r\n].


Se si desidera solo per preservare i caratteri alfanumerici, invece di aggiungere ogni carattere non alfanumerico in esistenza alla classe di caratteri, si potrebbe fare questo:

Regex regex = new Regex(@"[\W_]+"); 
string cleanText = regex.Replace(messyText, "").ToUpper(); 

Dove \W sono tutte le non parole carattere (non [^a-zA-Z0-9_]).

+0

'\ s' contiene anche' \ v' e '\ f', ma quelli non sono comunemente usati, quindi non dovrebbe essere un problema. –

+0

hai bisogno di RegexOptions.Multiline o la tua regex lo gestirà? –

+0

@Preet Credo che "RegexOptions.Multiline" abbia effetto solo sul comportamento dell'inizio e della fine delle ancore di stringa '^' e '$', ma potrei sbagliarmi. – 999999

2

Character classes per il salvataggio!

string messyText = GetText(); 
string cleanText = Regex.Replace(messyText.Trim().ToUpper(), @"[,:.;/\\\n\t\r ]+", "") 
+0

Questo non è equivalente al codice nella domanda. – quantumSoup

+0

@quantumSoup: Cosa mi manca? – kevingessner

+0

@kevingessner: usa @ "..." o il tuo \ t \ r \ n verrà convertito nel loro spazio bianco equiv.s da .NET. O sfuggirli, ma penso che @ sia più leggibile. – Dinah

0

Probabilmente vorresti usare un approccio di whitelist, c'è un oceano di personaggi divertenti il ​​cui effetto a seconda della combinazione potrebbe non essere facile da capire.

Una semplice espressione regolare che rimuove tutto, ma i caratteri consentiti potrebbe assomigliare a questo:

messyText = Regex.Replace(messyText, @"[^a-zA-Z0-9\x7C\x2C\x2E_]", ""); 

Il^è lì per invertire la selezione, a parte i caratteri alfanumerici questo regex permette | ,. e _ È possibile aggiungere e rimuovere caratteri e set di caratteri secondo necessità.

Problemi correlati