Сэм изучает регулярные выражения. Чтобы применить полученные знания, он написал параметризованный скрипт для поиска файла по маске. Маска задаётся в виде регулярного выражения. В качестве значений параметров могут быть использованы числа или заглавные буквы английского алфавита.
Скрипт имеет следующие параметры:
1. Искать в только текущей папке или в ней и её подпапках (передаётся значение C для поиска в текущей
папке и S для поиска в ней и подпапках)
2. Если поиск осуществляется в подпапках, то какая максимальная глубина поиска (натуральное число - если
глубина ограничена, буква A – если ограничения нет; число 1 соответствует поиску только в текущей
папке)
3. После скольки совпадений остановить поиск (натуральное число - если необходимо ограничить число
найденных совпадений, буква A – если ограничения нет). В случае, если не удастся найти заданное число
совпадений, будут показаны те, что удалось найти.
4. Регулярное выражение, по которому осуществляется поиск. Формат регулярного выражения описан ниже.
Для задания регулярных выражений приняты следующие обозначения:
с |
Любой неспециальный символ с соответствует самому себе. Специальными символами будем считать
только символы [, ], {, }, *, +, -, ? – эти символы не могут по условию данной задачи встретится в тексте. |
[...] |
Любой символ из ...; допустимы диапазоны типа а-z (последовательно идущие символы в алфавите);
возможно объединение диапазонов, например [a-z0-9] и сочетание диапазонов и отдельных символов [a-z0-9~#]. |
r* |
Ноль или более вхождений символа , может применяться и для диапазонов, например [a-z#]* означает ноль
или более вхождений любых символов из диапазона от a до z или символа # в любом порядке. |
r+ |
Одно или более вхождений символа , может применяться и для диапазонов, например [a-z>]+ означает одно
или более вхождений любых символов из диапазона от a до z или символа > в любом порядке. |
r? |
Ноль или одно вхождение символа , может применяться и для диапазонов, например [a-z@]? означает ноль
или одно вхождение любого символа из диапазона от a до z или символа @. |
r1r2 |
За символом или диапазоном 1 следует символ или диапазон 2. |
{ } |
Число вхождений предыдущего выражения. Например, выражение [0-9]{5} соответствует подстроке из пяти
десятичных цифр. |
^ |
Символ начала строки. Регулярное выражение должно начинаться с этого символа. |
$ |
Символ конца строки. Регулярное выражение должно заканчиваться этим символом. |
Пример: регулярное выражение
^a+[a-z]{5}.[0-9]*$ позволяет найти все последовательности символов, которые
начинаются с одного или нескольких символов a, после которых идут ровно 5 маленьких латинских букв, затем точка и
затем может следовать любое количество (в том числе ноль) арабских цифр.
Фрагмент файловой системы, на котором он проверял скрипт выглядит следующим образом:
| folder1 |
folder2 |
folder3 |
folder4 |
folder5 |
| folder2 |
folder3 |
folder5 |
vhs.exe |
balloon.mp4 |
| baobab.png |
folder4 |
bavaria.mov |
qsort.cpp |
bunny_baks.jpg |
| abba_song.mp3 |
blablacar.zip |
baldurs.mp4 |
mergesort.java |
abcabcabc.doc |
| albania.zip |
lalaland.mov |
black.png |
algorythm.java |
|
| the_abs.doc |
absolute.cpp |
band.png |
sort_algo.jar |
|
| car_ab.jpg |
|
|
alter_ego_a.mp4 |
|
| vabadab.doc |
|
|
tart.zip |
|
| the_asbolute.mov |
|
|
alter_ego_b.mp4 |
|
В первой строке каждого столбца указано название папки, далее – её содержимое. Все элементы с названием folder*, где * является числом, являются папками. В момент запуска скрипта обработка начинается с содержимого folder1 в алфавитном порядке. Сначала скрипт проверяет файлы, затем содержимое подпапок. В случае нескольких подпапок они также проверяются в алфавитном порядке.
Скрипт был запущен с параметрами S, 2, 5 и некоторым регулярным выражением и вывел следующий результат:
albania.zip
abba_song.mp3
baobab.png
car_ab.jpg
the_abs.doc
Определите, какие из представленных регулярных выражений могли быть использованы:
1. ^[a-z_]*a[a-z_]*a[a-z0-9.]*$
2. ^a[a-z]*$
3. ^[a-z_]*a[a-z0-9._]*$
4. ^[a-z0-9._]{6}[a-z0-9._]*$
5. ^[a-z_]*a[a-z.]*$
6. ^[a-z0-9._]+$
7. ^[a-z_]*a[a-z0-9]*$
В ответ запишите через пробел в порядке возрастания номера всех регулярных выражений, которые могли обеспечить подобный результат.
Примечание: Глубиной поиска в файловой системе называют число папок в пути от корневой до текущей, включая корень. Например, глубина поиска в корневой папке – 1, т.к. путь до неё содержит всего одну папку – её саму. Если текущая папка лежит в корневой папке – её глубина равна 2, и так далее. Количеством совпадений (количеством результатов поиска) называют число найденных файлов, которые удовлетворяют условиям поиска