2010-10-07 26 views
6

No tengo mucha experiencia con RegEx, así que estoy usando muchas cadenas de caracteres String.Replace() para eliminar caracteres no deseados. ¿Existe un RegEx que pueda escribir para optimizar esto?Regex para reemplazar caracteres no válidos

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

Gracias

+1

Incluso si no es su convención de codificación preferida, si colocara cada '.Replace()' en una nueva línea, ayudaría a la legibilidad en este sitio para que no haya un gran desplazamiento horizontal. – Dinah

Respuesta

13

probar este regex:

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

\s es una clase de caracteres equivalentes a [ \t\r\n].


Si lo que desea es preservar caracteres alfanuméricos, en lugar de añadir cada carácter no alfanumérico en la existencia de la clase de caracteres, se puede hacer esto:

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

Dónde \W es cualquier no-palabra personaje (no [^a-zA-Z0-9_]).

+0

'\ s' también contiene' \ v' y '\ f', pero esos no son tan comunes, por lo que no debería ser un problema. –

+0

¿necesita RegexOptions.Multiline o su regex lo manejará? –

+0

@Preet Creo que 'RegexOptions.Multiline' solo afecta el comportamiento del inicio y el final de los anclajes de cadena'^'y' $ ', pero podría estar equivocado. – 999999

2

Character classes al rescate!

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

Esto no es equivalente al código en la pregunta. – quantumSoup

+0

@quantumSoup: ¿Qué extrañaría? – kevingessner

+0

@kevingessner: use @ "..." o su \ t \ r \ n se convertirá en sus equivalentes de espacio en blanco por .NET. O escapar de ellos, pero creo que @ es más legible. – Dinah

0

Es probable que desee utilizar un enfoque de lista blanca, hay un océano de personajes divertidos cuyo efecto dependiendo de la combinación puede no ser fácil de entender.

Una simple expresión regular que elimina todo excepto los caracteres permitidos podría tener este aspecto:

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

El^está ahí para invertir la selección, además de los caracteres alfanuméricos esta expresión regular permite | , y _ Puede agregar y eliminar caracteres y conjuntos de caracteres según sea necesario.

Cuestiones relacionadas