2012-08-29 20 views
12

Necesito limpiar los nombres de los archivos. Así que tengo este código:Regex para que coincida con cualquier carácter que no sea palabra, pero menos

//\W_ is any non-word character (not [^a-zA-Z0-9_]). 
Regex regex = new Regex(@"[\W_]+"); 
return regex.Replace(source, replacement); 

Esto funciona bien, pero ahora no quiero quitar el signo menos (-), así que cambié la expresión regular a esto:

[\W_^-]+ 

pero eso no trabajo. ¿Qué me perdí?

+1

Si se utiliza el símbolo de intercalación (^ '') en una clase de caracteres en cualquier lugar que no sea el comienzo, pierde su significado especial. Y cuando lo usas correctamente, niega todo en la clase de personaje. Utilice ['[^ a-zA-Z0-9-] +'] (http://rubular.com/r/onJOpL9Fwk) en su lugar. – NullUserException

+0

Gracias. Eso funciona. Pensé que uno podría hacer algo simple con la \ W, pero supongo que no. Si agrega su comentario como respuesta, puedo aprobarlo. – Remy

Respuesta

16

Trate de usar esta expresión regular:

[^\w-]+ 

Editar:

parece que la expresión regular correcta es:

[^a-zA-Z0-9-]+ 
+1

Creo que esto es parcialmente incorrecto, porque no coincide con el guión bajo. – NullUserException

+0

La \ w es igual a [a-zA-Z0-9_] – Oussama

+1

Correcto, por lo que cuando niega '\ w' también está excluyendo el guión bajo. – NullUserException

Cuestiones relacionadas