boost::string_algo详解2——find相关函数

来源:互联网 发布:托米.韦素 知乎 编辑:程序博客网 时间:2024/06/05 05:54
函数声明:
[cpp] view plaincopyprint?
  1. template<typename Range1T, typename Range2T>  
  2.  iterator_range find_first(Range1T & Input, const Range2T & Search);  
  3. template<typename Range1T, typename Range2T>  
  4.  iterator_range find_last(Range1T & Input, const Range2T & Search);   
  5. template<typename Range1T, typename Range2T>  
  6.  iterator_range find_nth(Range1T &Input, const Range2T & Search, int Nth);  
  7. template<typename RangeT>  
  8.  find_head(RangeT &Input, int N);  
  9. template<typename RangeT>  
  10.  find_tail(RangeT & Input, int N);  
例子:
[cpp] view plaincopyprint?
  1. // find_first:【1】查找字符串在输入中第一次出现的位置。  
  2. // find_last: 【2】查找字符串在输入中最后一次出现的位置。  
  3. // find_nth:  【3】查找字符串在输入中的第n次(从0开始计数)出现的位置。  
  4. // find_head: 【4】取一个字符串开头N个字符的字串,相当于substr(0,n);  
  5. // find_tail: 【5】取一个字符串末尾N个字符的字串。  
  6. void test_string_find_string()  
  7. {  
  8.     std::string str1("a1234_first_nth_first_nth_");  
  9.     boost::iterator_range<std::string::iterator> ir;  
  10.   
  11.     // find_first与ifind_first(不区分大小写,其它同find_first)  
  12.     ir = boost::find_first(str1, "first");  
  13.     // 1. 通过iterator_range构建字符串  
  14.     assert(std::string(ir.begin(), ir.end()) == "first");  
  15.     // 2. 查看搜索到的字符串所在位置  
  16.     assert(ir.begin() - str1.begin() == 6 && ir.end() - str1.begin() == 6 + 5);  
  17.     // 3. 利用iterator_range处理搜索到的字符串  
  18.     boost::to_upper(ir);  
  19.     assert(str1 == "a1234_FIRST_nth_first_nth_");  
  20.     boost::to_lower(ir);  
  21.     assert(str1 == "a1234_first_nth_first_nth_");  
  22.   
  23.     // find没有找到的情况  
  24.     ir = boost::find_first(str1, "no");  
  25.     assert(ir.empty()); // 不存在  
  26.     assert(std::string(ir.begin(), ir.end()).empty()); // 不存在,仍可构建一个string  
  27.     std::ostringstream osstr;  
  28.     osstr << boost::find_first(str1, "_first_");  
  29.     assert(osstr.str() == "_first_");  
  30. }  
find_token的函数声明
[cpp] view plaincopyprint?
  1. template<typename RangeT, typename PredicateT>  
  2.   iterator_range< typename range_iterator< RangeT >::type >  
  3.     find_token(RangeT & Input, PredicateT Pred,  
  4.                token_compress_mode_type eCompress = token_compress_off);  
find_token的例子
[cpp] view plaincopyprint?
  1. void test_string_find_token()  
  2. {  
  3.     using namespace boost;  
  4.   
  5.     std::string str1("ab1234_first_nth_first_nth_");  
  6.     iterator_range<std::string::iterator> ir;  
  7.   
  8.     ir = find_token(str1, is_any_of("irfst"));  
  9.     assert(std::string(ir.begin(), ir.end()) == "f");  
  10.   
  11.     ir = find_token(str1, is_any_of("xfirts"), token_compress_off);  
  12.     assert(std::string(ir.begin(), ir.end()) == "f");  
  13.   
  14.     ir = find_token(str1, is_any_of("irfst"), token_compress_on);  
  15.     assert(std::string(ir.begin(), ir.end()) == "first");  
  16.   
  17.     ir = find_token(str1, is_any_of("fitr "), token_compress_on);  
  18.     assert(std::string(ir.begin(), ir.end()) == "fir");  
  19.   
  20.     ir = find_token(str1, is_lower(), token_compress_on);  
  21.     assert(std::string(ir.begin(), ir.end()) == "ab");  
  22. }  
find_regex的例子
[cpp] view plaincopyprint?
  1. // 注意加上头文件  
  2. // #include <boost/algorithm/string/regex.hpp>  
  3. // find_regex, find_all_regex  
  4. void test_string_find_regex()  
  5. {  
  6.     using namespace boost;  
  7.   
  8.     std::string str1("ab1234_first_nth_first_nth_");  
  9.     iterator_range<std::string::iterator> ir;  
  10.     regex rx("b[0-9]+_");  
  11.   
  12.     ir = find_regex(str1, rx);  
  13.     assert(std::string(ir.begin(), ir.end()) == "b1234_");  
  14.   
  15.     std::string str2("b1_b22_b333_b4444");  
  16.     std::vector<std::string> tokens;  
  17.     find_all_regex(tokens, str2, rx);  
  18.     assert(tokens.size() == 3);  
  19.     assert(tokens[0] == "b1_");  
  20.     assert(tokens[1] == "b22_");  
  21.     assert(tokens[2] == "b333_");  
  22.   
  23.     // 网络上找到的另一个例子  
  24.     std::string value = "123a1cxxxxa56c";  
  25.     regex pattern("a[0-9]+c");  
  26.     iterator_range<std::string::iterator> find_result;  
  27.     find_result = algorithm::find_regex(value, pattern);  
  28.     assert(!find_result.empty());  
  29.       
  30.     std::vector<std::string> results;  
  31.     find_all_regex(results, value, pattern);  
  32.     assert("a1c" == results[0]);  
  33.     assert("a56c" == results[1]);  
  34.     assert(!results.empty());  
  35.       
  36.     value = "10.10.10.10 1.1.1.1";  
  37.     boost::regex ip_pattern("(\\d{1, 3}.){3}\\d{1, 3}");  
  38.     find_all_regex(results, value, ip_pattern);  
  39.     assert("10.10.10.10" == results[0]);  
  40.     assert("1.1.1.1" == results[1]);  
  41.     assert(!results.empty());  
  42. }  
阅读全文
0 0