Подтвердить что ты не робот

С# - Regex - сопоставление имен файлов в соответствии с определенным шаблоном имен

У меня есть приложение, которое должно найти и обработать файлы, которые следуют очень конкретному соглашению об именах следующим образом.

IABC_12345-0_YYYYMMDD_YYYYMMDD_HHMMSS.zip

Я не могу найти простой способ сделать это с помощью шаблона поиска, поэтому я предполагаю, что я должен сделать что-то подобное после создания списка файлов с использованием более простого шаблона подстановок.

RegEx re = new RegEx("blah");

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

Это лучший способ сделать это, и если да, как бы я сформировал регулярное выражение для соответствия этому файловому формату?

4b9b3361

Ответ 1

    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

Это зависит от того, насколько конкретно вы хотите сопоставить эти имена. Достаточно ли это:

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

?

Пояснение:

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'

Но если у вас есть файлы, чьи имена содержат недопустимые даты или время, это не может быть сделано практически с помощью регулярного выражения, особенно если ваша часть DATE_DATE указывает диапазон дат. Вам нужно будет сопоставить все имена файлов, такие как я (и другие), которые вам показали, а затем выполнить некоторую "обычную" логику программирования, чтобы отфильтровать недопустимые.

Ответ 3

Для простого регулярного выражения, которое также будет соответствовать недействительным спецификациям времени (например, часы = 73 и т.д.), вы можете использовать что-то вроде этого:

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

Ответ 4

RegexBuddy - отличный способ потратить несколько долларов (если вам придется потратить). Это поможет вам разработать, протестировать и отладить ваши регулярные выражения. Он даже создает для вас фрагменты кода.

RegexMagic (от того же автора) может даже помочь вам больше: он помогает вам создать шаблон регулярных выражений из образцов. (Я не пробовал, хотя я не могу сказать, хорошо ли это).