#c #regex #std
Вопрос:
Я просматриваю какой-то каталог и хочу распечатать все файлы, которые заканчиваются на .txt. Этот код не работает.
ft::Путь к файлу Путь к файлу; std::файловая система::recursive_directory_iterator iter(m_rootDirectoryPath);
const std::regex e("*.txt");
for(;iter != std::filesystem::end(iter); iter)
{
if(std::regex_match(iter->path().string(),e))
{
const std::stringamp; p = iter->path().string();
uint64_t pos = p.find(m_rootDirectoryPath.string());
filePath.set_path(p.substr(pos m_rootDirectoryPath.string().size()));
writer->Write(filePath);
}
}
Какое регулярное выражение соответствует всем файлам, которые заканчиваются на .txt? (вы должны предположить, что я использую std::регулярное выражение для сопоставления шаблонов)
Комментарии:
1. Не по теме, но… если шаблон настолько прост, его, возможно, лучше использовать
std::filesystem::path::extension
, а не регулярное выражение.2. Да, но я пишу функцию, которая возвращает вектор файлов, соответствующих определенному регулярному выражению. Я просто хотел проверить эту функцию, но я вообще не знаю регулярного выражения.
Ответ №1:
".*\.txt$"
Ваше выражение-это шарик, используемый в оболочках.
Ответ №2:
Привет, регулярное выражение, которое вы ищете, это R"(.*.txt$)"
#include <vector>
#include <regex>
#include <string>
#include <iostream>
int main(int argc, char* argv[]) {
const std::regex e{R"(.*.txt)"};
const std::vector<std::string> files{{"toto.txt", "titi.doc", "tata.txt", "txt"}};
for(const autoamp; str : files)
{
if(std::regex_match(str, e))
{
std::cout << str << 'n';
}
}
std::cout.flush();
}
Обратите внимание, что:
- вы можете протестировать регулярное выражение на следующем сайте: https://regex101.com
- если вы изучаете C 20, вы можете использовать
ends_with
- путь к файловой системе имеет метод
extension
Комментарии:
1. Нет, это ссылка на синтаксис C 11
R
, которая позволяет избежать двойного