Теория
Маска — это шаблон, по которому проверяют имена файлов. В маске два особых символа: * заменяет любую последовательность символов, в том числе пустую, а ? — ровно один символ. Все остальные символы, включая точку, сравниваются буквально: маска a*.txt подходит файлам aa.txt и aab.txt, но не подходит aba.doc, потому что расширение в шаблоне задано явно.
Компьютер проверяет маску, переводя её в регулярное выражение: литералы экранируются, * превращается в .*, ? — в ., а всё выражение зажимается между началом и концом строки: маска ?a*.txt превращается в ^.a.*\.txt$. Число подходящих файлов — это сумма по всем именам: \(M = \sum_{f \in F} m(f)\), где \(m(f) = 1\), если имя подходит под маску, и \(m(f) = 0\) иначе.
Сравнение бывает чувствительным к регистру и нет. В Windows и DOS имена файлов регистронезависимы, в Linux — нет, поэтому в маске есть отдельный переключатель «Не учитывать регистр»: при его включении к выражению добавляется флаг i, и маска A*.TXT находит aa.txt.
Важно:
*подходит и пустой последовательности, поэтому маскаa*.txtподходит файлу a.txt — звёздочка не требует ни одного символа.
Пример с решением
- Условие. Маска
?a*.txt, файлы: aa.txt, aba.doc, da.txt, na.txt, aab.txt. - Перевод в выражение.
?— один любой символ,a— литерал,*— любые символы,.txt— литерал с экранированной точкой:^.a.*\.txt$. - Проверка aa.txt. Первый символ
aпопадает в?, второйaсовпадает с литералом, дальше*пусто и остаётся.txt— подходит. - Проверка da.txt и na.txt. Первые символы
dиnтоже подходят под?, второй символ —a— совпадает с литералом: оба файла подходят. - Проверка aba.doc. Расширение
.docне совпадает с литералом.txt— файл не подходит. - Проверка aab.txt.
?берёт первуюa, литерал — вторуюa,*забираетb, остаётся.txt— подходит. - Ответ. Подходят 4 файла: aa.txt, da.txt, na.txt, aab.txt. Если убрать
?и оставить маскуa*.txt, подходящих файлов станет два: aa.txt и aab.txt.
Главное
*— любая последовательность символов,?— ровно один символ.- Остальные символы, включая точку, сравниваются буквально.
- Маска переводится в регулярное выражение с привязкой к началу и концу строки.
- Регистр учитывается или игнорируется по переключателю, флаг
iотключает его.