2010-06-28 15 views
6

soy muy nuevo en RegEx - así que por favor alguien puede ayudarme a averiguar lo que está pasando exactamente mal aquí?RegEx - cuantificador {x, y} siguiente error nada

tengo este código:

 string regPattern = "*[~#%&*{}/<>?|\"-]+*"; 
     string replacement = ""; 
     Regex regExPattern = new Regex(regPattern); 

Sin embargo, cuando mi aplicación golpea la línea regExPattern, consigo un ArgumentException - cuantificador {x, y} siguiente error nada.

¿Alguien puede ayudar?

EDIT: Tengo que pasar este patrón en un bucle foreach así:

if (paths.Contains(regPattern)) 
     { 
      foreach (string files2 in paths) 
      { 
       try 
       { 
        string filenameOnly = Path.GetFileName(files2); 
        string pathOnly = Path.GetDirectoryName(files2); 
        string sanitizedFileName = regExPattern.Replace(filenameOnly, replacement); 
        string sanitized = Path.Combine(pathOnly, sanitizedFileName); 
        //write to streamwriter 
        System.IO.File.Move(files2, sanitized); 

       } 
       catch (Exception ex) 
       { 
        //write to streamwriter 

       } 
      } 
     } 
     else 
     { 
     //write to streamwriter 

     } 

¿Cómo definir el patrón si se está pasando en este bucle?

+0

Para ser más específicos - el patrón que tengo en el código está destinado a deshacerse de esos caracteres no válidos en nombres de archivo. por lo tanto necesito para deshacerse de un asterisco, tilde, signo de número, entre paréntesis, corchetes, etc. es este el patrón correcto para eso? – yeahumok

Respuesta

6

Actualización: después de leer el comentario a la pregunta que creo que usted quiere simplemente esto:

s = Regex.Replace(s, "[~#%&*{}/<>?|\"-]+", ""); 

vieja respuesta: Creo que cuando se escribe * usted está pensando en comodines como los que tiene que escribir en una concha:

* .txt

Esto no es como las obras en * sintaxis de expresiones regulares. Lo que es probable que desee en cambio, es .*:

".*[~#%&*{}/<>?|\"-]+.*" 

Los . significa "cualquier carácter" y los "medios * cero o más de las anteriores".

Dentro de la clase de caracteres [...], el * pierde su significado especial y se convierte en un carácter literal por lo que no necesita ser escapado. Escapar innecesariamente dentro de la clase de personaje no causará ningún daño y a algunas personas les resulta más fácil de leer.

+0

* significa asterisco - no tiene ningún carácter. ¿Todavía necesito hacer una barra invertida? – yeahumok

+0

El significado de '*' cambia dependiendo de si está dentro de una clase de caracteres o no. Dentro de una clase de caracteres significa un '' 'literal, independientemente de si se ha escapado o no. Fuera de una clase de personaje, significa "cero o más" si no está esparcido y un literal '*' si se escapó. –

+0

+1 (para la revisión), y en C# debe usar cadenas verbatim para expresiones regulares.No usan la barra invertida como un carácter de escape; solo tiene que escapar de las comillas con otra comilla: '@" [~ #% & * {}/<>? | "" -] + "' –

1

El * es un cuantificador que significa "cero o más veces" (igual que {0,}). Vas a tener que escapar de ella mediante una barra invertida como esto: \*

0

Puesto que usted está haciendo un Regex.Replace para reemplazar cualquiera de estos partidos de un carácter con una cadena vacía:

 string pattern = "[~#%&*{}/()<>?|\"\\\\-^[\\]]"; 

     string input = @"(*&af%\#$}afd]a#f%hjg{d(^(^[RF*()^FR(7r5"; 

     string output = Regex.Replace(input, pattern, String.Empty); 
0

Añadir . antes de la *

por ejemplo, string regPattern = ".*[~#%&*{}/<>?|\"-]+.*";

Cuestiones relacionadas