无法使用 Boost RegEx 找到匹配项
Unable to find matches using Boost RegEx
我正在使用 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 Regular Expression Syntax. Also confirmed it using RegEx101.com,输出正确显示3个匹配如下:
some_0_file.txt
some_1_file.txt
some_2.file.txt
问题
我的代码片段或 RegEx 有什么问题吗?为什么 boost::regex_match
产生 0 个匹配项?
我错过了什么?
因为 regex_match
只考虑完全匹配。这意味着,您需要在模式中包含 ./
。您还错误地转义了最后一个点。您的模式应该是:
boost::regex pattern("\./some_\d+_file\.txt");
(或者您可以使用 .*
作为文件路径的开头,只是不要硬编码 ./
)
或者,您可以使用 regex_search
,如果部分字符串与表达式匹配,returns 则为 TRUE。
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()
并添加引号来处理路径中的空格
我正在使用 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 Regular Expression Syntax. Also confirmed it using RegEx101.com,输出正确显示3个匹配如下:
some_0_file.txt
some_1_file.txt
some_2.file.txt
问题
我的代码片段或 RegEx 有什么问题吗?为什么 boost::regex_match
产生 0 个匹配项?
我错过了什么?
因为 regex_match
只考虑完全匹配。这意味着,您需要在模式中包含 ./
。您还错误地转义了最后一个点。您的模式应该是:
boost::regex pattern("\./some_\d+_file\.txt");
(或者您可以使用 .*
作为文件路径的开头,只是不要硬编码 ./
)
或者,您可以使用 regex_search
,如果部分字符串与表达式匹配,returns 则为 TRUE。
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()
并添加引号来处理路径中的空格