Печать имен файлов .pdf из каталога с помощью Boost.regex

#c #boost

#c #boost

Вопрос:

Это мой код:

 path Path = "e:\Documents\";
boost::regex reg("(*.pdf)");
for(recursive_directory_iterator it(Path); it != recursive_directory_iterator();   it)
{
    if(boost::regex_search(it->string(), reg))
    {
        cout << *it << endl;
    }
}
  

Но я всегда получаю ошибку и прерываю () в Visual Studio, после запуска программы проблема в этой строке:

 boost::regex reg("(*.pdf)");
  

Я не объявляю объект regex хорошим?

Ответ №1:

*.pdf это не регулярное выражение, это большой размер (для сопоставления файлов). Вам нужно

 boost::regex reg("(.*\.pdf)"); 
  
  • . : соответствует любому символу
  • * : 0 или более предыдущих совпадений
  • \ : чтобы создать один для экранирования (игнорируйте значение следующего символа в регулярном выражении)

Комментарии:

1. Спасибо, я думал, что это будет работать так же, как в Linux, теперь все работает хорошо

2. Это стандартное регулярное выражение, такое же, как когда требуется регулярное выражение в Linux. В терминале в командной строке вы должны указывать большой размер, а не регулярное выражение. Для grep соответствующим аргументом является регулярное выражение, поэтому вы вводите grep <regex> <file glob>

3. Я запутался, почему вы используете 2 из «» там, но я вижу, что это работает и с одним

4. Это потому, что . соответствует любому символу, включая фактический . . Оно также будет соответствовать filename-pdf, filename pdf и т.д. Если вы хотите только сопоставить filename.pdf, используйте \.