C++ 无法使用Boost正则表达式找到匹配项
我使用Boost1.67.0正则表达式在当前文件夹中使用以下代码段查找匹配的文件名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
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;
ssboost::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没有理由一开始就麻烦流。另外,将正则表达式从循环中去掉。最后,不需要迭代器范围(是的,这是非常简化的演示):