C++ 无法使用Boost正则表达式找到匹配项

C++ 无法使用Boost正则表达式找到匹配项,c++,regex,c++11,boost,boost-regex,C++,Regex,C++11,Boost,Boost Regex,我使用Boost1.67.0正则表达式在当前文件夹中使用以下代码段查找匹配的文件名 boost::filesystem::path p("."); if(is_directory(p)) { for(auto& entry : boost::make_iterator_range(boost::filesystem::directory_iterator(p), {})){ std::stringstream ss; ss << en

我使用Boost1.67.0正则表达式在当前文件夹中使用以下代码段查找匹配的文件名

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;
        }            
    }   
}
为了确认匹配表达式是正确的,我查阅了。还使用确认,输出正确显示3个匹配项,如下所示:

some_0_file.txt
some_1_file.txt
some_2.file.txt
问题

我的代码片段或正则表达式有什么问题吗?为什么
boost::regex_match
生成0匹配


我错过了什么?

因为
regex\u match
只考虑完全匹配。这意味着,您需要在模式中包含
/
。您还错误地逃过了最后一个点。你的模式应该是:

boost::regex pattern("\\./some_\\d+_file\\.txt");
(或者您可以使用
*
作为文件路径的开头,但不要硬编码
/


或者,您可以使用
regex\u search
,如果字符串的一部分与表达式匹配,则返回TRUE。

,因为
regex\u match
只考虑完全匹配。这意味着,您需要在模式中包含
/
。您还错误地逃过了最后一个点。你的模式应该是:

boost::regex pattern("\\./some_\\d+_file\\.txt");
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;
        }
    }
}
(或者您可以使用
*
作为文件路径的开头,但不要硬编码
/

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

boost::filesystem::path p(“.”);
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;
        }
    }
}
if(is_目录(p)){ for(auto&entry:boost::make_iterator_range(boost::filesystem::directory_iterator(p),{})){ std::stringstream-ss; ss
boost::filesystem::path p(“.”);
if(is_目录(p)){
for(auto&entry:boost::make_iterator_range(boost::filesystem::directory_iterator(p),{})){
std::stringstream-ss;

谢谢你的回答。我尝试了
“\\./一些\uD+\u文件\\.txt”
“\\.*一些\uD+\u文件\\.txt”
作为我的模式。不幸的是,它们都不起作用。仍然得到0个匹配项。我将尝试
regex\u search
。是的,正如@user338371所提到的,您的文件名中还包含引号,在查找完全匹配项时必须考虑到这些引号。谢谢您的回答。我尝试了
“\\\\./一些\ud+\u文件\\.txt”
“\\.*一些\ud+\u文件\\.txt”
作为我的模式。不幸的是,它们都不起作用。仍然得到0个匹配项。我将尝试
regex_search
。是的,正如@user338371所提到的,在查找完全匹配项时,您的文件名中还包含引号。这解决了我的问题,谢谢。与@Ptaq66答案的唯一区别是
ss一开始就没有理由去处理流。另外,将正则表达式从循环中去掉。最后,不需要迭代器范围(是的,就是这样)非常简化的演示:这解决了我的问题,谢谢。与@Ptaq66的答案唯一的区别是
ss没有理由一开始就麻烦流。另外,将正则表达式从循环中去掉。最后,不需要迭代器范围(是的,这是非常简化的演示):