2009-10-21 5 views
11

J'ai une application qui doit trouver et ensuite traiter les fichiers qui suivent une convention de nommage très spécifique comme suit.C# - Regex - Correspondance des noms de fichiers selon un modèle de nommage spécifique

IABC_12345-0_YYYYMMDD_YYYYMMDD_HHMMSS.zip 

Je ne peux pas voir un moyen facile de le faire en utilisant un modèle de recherche si Im en supposant Ill faut faire quelque chose comme ça après avoir généré une liste de fichiers en utilisant un modèle générique plus simple. Est-ce la meilleure façon de le faire, et si oui, comment former une expression régulière pour correspondre à ce format de fichier?

Répondre

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

Pour une simple expression régulière qui correspondra également des spécifications de temps invalides (c.-à-heures = 73 etc.), Vous pouvez utiliser quelque chose comme ceci:

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

Cela dépend de la façon dont vous voulez spécifique pour correspondre à celles des noms. Est-ce assez spécifique:

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

?

Explication:

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' 

Mais, si vous avez des fichiers dont le nom contient les dates invalides ou fois, il ne peut pratiquement se faire avec regex seul, surtout si votre partie DATE_DATE spécifie une plage de dates. Vous devrez faire correspondre tous les noms de fichiers que j'ai (et d'autres) vous ont montrés, puis effectuer une logique de programmation "normale" pour filtrer les noms invalides.

0

RegexBuddy est une excellente façon de passer un peu d'argent (si vous en avez à dépenser). Cela vous aidera à développer, tester et déboguer vos regex. Il crée même des extraits de code pour vous.

RegexMagic (du même auteur) pourrait même vous aider: Il vous aide à créer un motif regex à partir d'échantillons. (Je ne l'ai pas essayé cependant je ne peux pas dire si c'est bon).

Questions connexes