我不知道提升,有人可以告诉我这个功能到底在做什么吗?
int
Function(const string& tempStr)
{
boost::regex expression ("result = ");
std::string::const_iterator start, end;
start = tempStr.begin();
end = tempStr.end();
boost::match_results<std::string::const_iterator> what;
boost::regex_constants::_match_flags flags = boost::match_default;
int count = 0;
while(regex_search(start, end, what, expression, flags)){
start = what[0].second;
count++;
}
cout << "Count :"<< count << endl;
return count;
}
答案 0 :(得分:2)
match_results是sub_match
个对象的集合。第一个sub_match
对象(索引0)表示目标序列中的完全匹配(后续匹配将对应于子表达式匹配)。您的代码正在搜索result =
个匹配项,并且每次从上一个匹配项结束时重新开始搜索(what[0].second
)
int
Function(const string& tempStr)
{
boost::regex expression ("result = ");
std::string::const_iterator start, end;
start = tempStr.begin();
end = tempStr.end();
boost::match_results<std::string::const_iterator> what;
boost::regex_constants::_match_flags flags = boost::match_default;
int count = 0;
while(regex_search(start, end, what, expression, flags)){
start = what[0].second;
count++;
}
cout << "Count :"<< count << endl;
return count;
}
int main()
{
Function("result = 22, result = 33"); // Outputs 'Count: 2'
}
答案 1 :(得分:0)
功能的基础是在tempStr
上搜索正则表达式匹配。
查看regex_search文档并注意match_result在完成后包含的内容(这是第3个参数,或代码示例中的what
)。从那里了解while
循环应该是直截了当的。
答案 2 :(得分:0)
此函数是计算"result = "
字符串出现次数的复杂方法。一种更简单的方法是:
boost::regex search_string("result = ");
auto begin = boost::make_regex_iterator(tempStr, search_string);
int count = std::distance(begin, {});
可以折叠为单行,可能会失去可读性。
答案 3 :(得分:0)
这是一个匹配计数器功能:
作者使用无用的代码:这是std(也是boost)中的等效代码
unsigned int count_match( std::string user_string, const std::string& user_pattern ){
const std::regex rx( user_pattern );
std::regex_token_iterator< std::string::const_iterator > first( user_string. begin(), user_string.end(), rx ), last;
return std::distance( first, last );
}
和std::regex_search
它可以(也是提升):
unsigned int match_count( std::string user_string, const std::string& user_pattern ){
unsigned int counter = 0;
std::match_results< std::string::const_iterator > match_result;
std::regex regex( user_pattern );
while( std::regex_search( user_string, match_result, regex ) ){
user_string = match_result.suffix().str();
++counter;
}
return counter;
}
注意:
无需使用此部分:
std::string::const_iterator start, end;
start = tempStr.begin();
end = tempStr.end();
另外
boost::match_results<std::string::const_iterator> what;
可以
boost::smatch what // a typedef of match_results<std::string::const_iterator>
不需要:
boost::regex_constants::_match_flags flags = boost::match_default;
因为默认情况下regex_search
有此标志
这个:
start = what[0].second;
用于更新迭代,可以是:
match_result.suffix().str();
如果你想看看while循环中发生了什么,请使用以下代码:
std::cout << "prefix: '" << what.prefix().str() << '\n';
std::cout << "match : '" << what.str() << '\n';
std::cout << "suffix: '" << what.suffix().str() << '\n';
std::cout << "------------------------------\n";