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;
        }
    }
  • 相关阅读:
    大数加法、乘法实现的简单版本
    hdu 4027 Can you answer these queries?
    zoj 1610 Count the Colors
    2018 徐州赛区网赛 G. Trace
    1495 中国好区间 尺取法
    LA 3938 动态最大连续区间 线段树
    51nod 1275 连续子段的差异
    caioj 1172 poj 2823 单调队列过渡题
    数据结构和算法题
    一个通用分页类
  • 原文地址:https://www.cnblogs.com/liaocheng/p/4390536.html
Copyright © 2011-2022 走看看