назад к списку статей

Маска файла с помощью регулярных выражений

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

В .Net Framework для работы с регулярными выражениями используется класс Regex из пространства имен System.Text.RegularExpressions. Конструктор класса имеет один или два параметра:

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

Регулярное выражение задается с помощью определенных правил, часть которых мы рассмотрим ниже:

  • ^ - признак начала строки;
  • . - один символ;
  • .* - множество символов;
  • \. - точка;
  • $ - признак конца строки;
  • | - логическое ИЛИ;

Итак, постановка задачи: реализовать проверку имени файла на соответствие какой-либо из масок, заданных одной строкой с разделителем. Например, соответствует ли имя файла "C:\Program Files\STUD-WORK.xml" какой либо маске из "STUD-*.xml|*.csv|*.7z|???.???". При задании маски используются dos-освкие обозначения, где * - множество символов, а ? - один символ.

Логика работы функции: разбивает входную строку со списком масок на отдельные маски, переводит каждую из них в регулярное выражение, и проверяет имя файла (без абсолютного пути) на соответствие хоть одному регулярному выражению

using System.Text.RegularExpressions;
..................
bool fl = checkMask(@"C:\Program Files\STUD-WORK.xml", "STUD-*.xml|*.csv|*.7z|???.???");
..................
 /// <summary>
 /// Проверка соответствия имени файла маске
 /// </summary>
 /// <param name="fileName">Имя проверяемого файла</param>
 /// <param name="input">Маска файла</param>
 /// <returns>true - файл удовлетворяет маске, иначе false</returns>
 static public bool checkMask(string fileName, string input)
 {
    string[] exts = input.Split('|', ',', ';');
    string pattern = string.Empty;
    foreach (string ext in exts)
    {
        pattern += @"^";//признак начала строки
        foreach (char symbol in ext)
        switch (symbol)
        {
            case '.': pattern += @"\."; break;
            case '?': pattern += @"."; break;
            case '*': pattern += @".*"; break;
            default: pattern += symbol; break;
        }
        pattern += @"$|";//признак окончания строки
    }
    if (pattern.Length == 0) return false;
    pattern = pattern.Remove(pattern.Length - 1);
    Regex mask = new Regex(pattern, RegexOptions.IgnoreCase);
    return mask.IsMatch(System.IO.Path.GetFileName(fileName));
 }

В функции используется метод IsMatch класса Regex, который позволяет проверить, соответствует ли входная строка регулярному выражению. Исходные dos-овские маски переводятся в регулярные выражения. Например, в нашем примере:

  • STUD-*.xml переведется в ^STUD-.*\.xml$
  • *.csv переведется в ^.*\.csv$
  • *.7z переведется в ^.*\.7z$
  • ???.??? переведется в ^...\....$

назад к списку статей

Поделитесь этой страницей со своими друзьями:

Нравится


I'mon Google+ .