zoukankan      html  css  js  c++  java
  • 使用Boost Regex 的regex_search进行遍历搜索

    在regex_search函数中,会将找到的第一个匹配结果保存到一个smatch类中。

    然而如果搜索字符串中有多个匹配结果,则需要自己实现了。

    在smatch中,有两个成员,官方文档如下:

    iterator first:

    An iterator denoting the position of the start of the match.

    iterator second

    An iterator denoting the position of the end of the match.

    所以,使用如下方法,可以得到遍历搜索:

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. #include <string>  
    2. #include <iostream>  
    3. #include <boost egex.hpp>  
    4. int main()  
    5. {  
    6.     std::string str = "192.168.1.1";  
    7.   
    8.     boost::regex expression("\d+");  
    9.     boost::smatch what;  
    10.   
    11.     std::string::const_iterator start = str.begin();  
    12.     std::string::const_iterator end = str.end();  
    13.     while ( boost::regex_search(start, end, what, expression) )  
    14.     {  
    15.         std::cout << what[0] << std::endl;  
    16.         start = what[0].second;  
    17.     }  
    18.     return 0;  
    19. }  

    结果如下:
    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. 192  
    2. 168  
    3. 1  
    4. 1  

    在boost中,还提供了一种迭代器的方法,名称为:sregex_iterator,默认构造器会生成一个结束迭代器。用法如下:

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. #include <string>  
    2. #include <iostream>  
    3. #include <boost egex.hpp>  
    4. int main()  
    5. {  
    6.     std::string str = "192.168.1.1";  
    7.   
    8.     boost::regex expression("\d+");  
    9.     boost::sregex_iterator it(str.begin(), str.end(), expression);  
    10.     boost::sregex_iterator end;  
    11.     for (; it != end; ++it)  
    12.         std::cout << *it << std::endl;  
    13.   
    14.     return 0;  
    15. }  

    效果与上一例相同。
     
    如果不需要遍历,只需要匹配,那更简单:
        boost::regex reg( szReg );
        bool r=boost::regex_match( szStr , reg);
    或是需要放入一个cmatch 中:
    {
        boost::cmatch mat;
        boost::regex reg( "\d+" );    //查找字符串里的数字
        if(boost::regex_search(szStr, mat, reg))
        {
            cout << "searched:" << mat[0] << endl;
        }
    }
  • 相关阅读:
    JSON Web令牌(JWT)
    CSRF跨站点请求伪造(Cross—Site Request Forgery)
    logging模块
    Django中使用Celery
    第一坑 先引入jQuery ./引入
    CSS 入门
    超大型文件传输方案 + socket + subprocess popen 远程执行系统命令
    MYSQL的执行计划 事务处理 和 跑路
    mysql 存储过程
    Django中CBV View的as_view()源码解析
  • 原文地址:https://www.cnblogs.com/liaocheng/p/4390536.html
Copyright © 2011-2022 走看看