Невозможно найти совпадения с помощью Boost RegEx - PullRequest
0 голосов
/ 05 сентября 2018

Я использую boost 1.67.0 regex , чтобы найти подходящие имена файлов в текущей папке, используя следующий фрагмент

boost::filesystem::path p(".");
if(is_directory(p)) {

    for(auto& entry : boost::make_iterator_range(boost::filesystem::directory_iterator(p), {})){
        std::stringstream ss;
        ss << entry;
        std::string filename = ss.str();
        std::cout << filename << std::endl;
        boost::regex pattern("some_\\d+_file\.txt");

        if(boost::regex_match(filename, pattern)){
            std::cout << "matched" << filename << std::endl;
        }            
    }   
}

Содержимое текущего каталога, созданного строкой std::cout << filename << std::endl;:

"./myApp.out"
"./some_0_file.txt"
"./some_1_file.txt"
"./other_file.txt"
"./some_other_file.txt"
"./some_2_file.txt"

Чтобы подтвердить, что мое совпадающее выражение является правильным, я обратился к Синтаксис регулярного выражения Perl . Также подтвердил это с помощью RegEx101.com , вывод правильно показывает 3 совпадения следующим образом:

some_0_file.txt
some_1_file.txt
some_2.file.txt

Вопрос

Что-то не так с моим фрагментом или RegEx? Почему boost::regex_match дает 0 совпадений?

Что я пропустил?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018
boost::filesystem::path p(".");
if (is_directory(p)) {

    for (auto& entry : boost::make_iterator_range(boost::filesystem::directory_iterator(p), {})) {
        std::stringstream ss;
        ss << entry.path().string(); //2
        std::string filename = ss.str();
        std::cout << filename << std::endl;
        boost::regex pattern(".*some_\\d+_file\\.txt"); //1
        if (boost::regex_match(filename, pattern)) {
            std::cout << "matched" << filename << std::endl;
        }
    }
}

1. regex_match только полное совпадение

2. operator<<(std::basic_ostream<Char, Traits>& os, const path& p) будет использовать boost::io::quoted() и добавлять кавычки для обработки пробелов в путях

0 голосов
/ 05 сентября 2018

Потому что regex_match считает только полное совпадение. Это означает, что вам нужно включить ./ в ваш шаблон. Также вы избежали последней точки неправильно. Ваш шаблон должен быть:

boost::regex pattern("\\./some_\\d+_file\\.txt");

(или вы можете использовать .* в качестве начала пути к файлу, только не для жесткого кода ./)

В качестве альтернативы вы можете использовать regex_search, который возвращает TRUE, если часть строки соответствует выражению.

...