2009-10-21 14 views
11

Tengo una aplicación que necesita encontrar y procesar archivos que siguen una convención de nomenclatura muy específica de la siguiente manera.C# - Regex - Coincidencia de nombres de archivos según un patrón de nomenclatura específico

IABC_12345-0_YYYYMMDD_YYYYMMDD_HHMMSS.zip 

no puedo ver ninguna manera fácil de hacer esto usando un patrón de búsqueda así que estoy suponiendo que la enfermedad tiene que hacer algo como esto después de haber generado una lista de archivos que utilizan un patrón de comodines más simple.

RegEx re = new RegEx("blah"); 

foreach(FileInfo fi in Directory.GetFiles(path, "I*.zip")) 
{ 
    if(re.IsMatch(fi.Name)) 
     //blah blah blah 
} 

¿Es esta la mejor manera de hacer esto, y si es así, ¿cómo iba a formar una expresión regular para que coincida con este formato de archivo?

Respuesta

14
string pattern = @"I[A-Z]{3}_\d{5}-\d_\d{8}_\d{8}_\d{6}\.zip"; 
    var matches = Directory.GetFiles(@"c:\temp") 
     .Where(path => Regex.Match(path, pattern).Success); 

    foreach (string file in matches) 
     Console.WriteLine(file); // do something 
2

Para un simple expresión regular que también tendrán las especificaciones de tiempo no válidos (es decir, = 73 horas etc.), Se puede usar algo como esto:

^I[A-Z]{3}_\d{5}-\d_\d{8}_\d{8}_\d{6}\.zip$ 
7

Depende de lo específico que desea que coincidan con los nombres. ¿Es esto lo suficientemente específico:

I[A-Z]{3}_\d{5}-\d_\d{8}_\d{8}_\d{6}\.zip 

?

Explicación:

I    // match an 'I' 
[A-Z]{3}  // followed by three upper case letters 
_    // followed by an underscore 
\d{5}   // followed by five digits 
-    // followed by a hyphen 
\d   // followed by a single digit 
_    // followed by an underscore 
\d{8}   // followed by eight digits 
_    // followed by an underscore 
\d{8}   // followed by eight digits 
_    // followed by an underscore 
\d{6}   // followed by six digits 
\.zip   // followed by '.zip' 

Pero, si tiene archivos cuyos nombres contienen fechas u horas no válidas, que prácticamente no puede hacerse con expresiones regulares solo, especialmente si su parte DATE_DATE especifica un intervalo de fechas. Tendrá que coincidir con todos los nombres de archivo como I (y otros) le han mostrado, y luego ejecutar una lógica de programación "normal" para filtrar los inválidos.

0

RegexBuddy es una excelente manera de pasar un poco de dinero (si tiene alguna para gastar). Le ayudará a desarrollar, probar y depurar sus expresiones regulares. Incluso crea fragmentos de código para ti.

RegexMagic (del mismo autor) podría incluso ayudarlo más: le ayuda a crear un patrón de expresiones regulares a partir de muestras. (No lo he probado, así que no puedo decir si es bueno).