zoukankan      html  css  js  c++  java
  • 【Boost】boost::string_algo详解2——find相关函数

    来自: https://blog.csdn.net/huang_xw/article/details/8276123 

    函数声明:

    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);

    例子:

    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的函数声明

    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的例子

    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的例子

      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.  
  • 相关阅读:
    su命令Permission denied
    Linux网络故障
    nsswitch
    route命令
    GCC编译器原理(三)------编译原理三:编译过程(3)---编译之汇编以及静态链接【1】
    GCC编译器原理(三)------编译原理三:编译过程(2-2)---编译之语法分析
    GCC编译器原理(三)------编译原理三:编译过程(2-1)---编译之词法分析
    GCC编译器原理(三)------编译原理三:编译过程---预处理
    GCC编译器原理(二)------编译原理一:ELF文件(3)
    GCC编译器原理(二)------编译原理一:ELF文件(2)
  • 原文地址:https://www.cnblogs.com/time-is-life/p/9370265.html
Copyright © 2011-2022 走看看