无法使用Boost RegEx查找匹配项

时间:2018-09-05 09:38:03

标签: c++ regex c++11 boost boost-regex

我正在使用 boost 1.67.0 regex 使用以下代码段在当前文件夹中找到匹配的文件名

sourceSets {
    main {
        output.resourcesDir = file('out/production/classes')
        output.classesDir = file('out/production/classes')
    }
    test {
        output.resourcesDir = file('out/test/classes')
        output.classesDir = file('out/test/classes')
    }
}

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;

为确认我的匹配表达式正确,我咨询了Perl Regular Expression Syntax。还使用RegEx101.com进行了确认,输出正确显示3个匹配,如下所示:

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

问题

我的代码段或RegEx有什么问题吗?为什么some_0_file.txt some_1_file.txt some_2.file.txt 产生0个匹配?

我错过了什么?

2 个答案:

答案 0 :(得分:2)

因为regex_match仅考虑了完全匹配。这意味着您需要在模式中包括./。您也错误地逃脱了最后一个点。您的模式应为:

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

(或者您可以使用.*作为文件路径的开头,只是不对./进行硬编码)

或者,您可以使用regex_search,如果部分字符串与表达式匹配,则返回TRUE。

答案 1 :(得分:2)

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()并添加引号来处理路径中的空格