У меня есть строковый массив списка содержимого каталога. Я хочу перечислить все строки, которые не начинаются с "." (т.е. не скрытые имена).
🚩 Ограничения, налагаемые контекстом, требуют решения Regex, которое работает на C++. Это не может быть изменено.
Например, учитывая это:
string fileList[] = {"test.png", "Hellozip.zip", "123.mp3", "hid.mp3", "hid.file.png", "sp ace.png", "comm(a.mp3", ".Hidden.txt"};
".hid.mp3" и ".Hidden.txt" должны быть отфильтрованы.
Вот тестовый код, для которого регулярное выражение должно работать:
string fileList[] = {"test.png", "Hellozip.zip", "123.mp3", "hid.mp3", "hid.file.png", "sp ace.png", "comm(a.mp3", ".Hidden.txt"};
for(auto& file : fileList)
{
if (std::regex_match(file, std::regex(fileRegex, std::regex_constants::icase)) == true)
{
cout << file << " - Match\n";
}
else
{
cout << file << " - No Match\n";
}
}
Я пробовал следующее, но это не работает:
string fileRegex = "\[\\w-\]*\\.{0,1}\[\\w- ()\]*\\.(png|jpg|zip|mp3|txt)";
Решение не должно заботиться об обработке особых случаев «.», «..».
Зачем использовать регулярное выражение для этого? Не проще ли было бы проверить первый символ на наличие . и удалить файл? Затем добавить . и .. в список после этого (поскольку они есть в каждом каталоге)?
Еще одна подсказка: используйте std::string::find_first_of('.')
Знакомо ли вам выражение «теперь у вас две проблемы»? Погуглите, если нет.
@JerryCoffin В большинстве (всех?) unix-подобных системах корневой каталог имеет ссылку .. на корень.
Мне нужно использовать существующую функцию (не изменять, поскольку она используется другими функциями), поэтому я не могу изменять параметры функции...
Пожалуйста, отредактируйте вопрос, чтобы ограничить его конкретной проблемой с достаточной детализацией, чтобы найти адекватный ответ.
Как насчет
^[^.].*$
Кажется работает
И вы можете проверить регулярное выражение, используя этот сайт: regex101.com
Это совершенно тривиально без регулярного выражения. Есть ли веская причина для усложнения?