使用Boost Regex 的regex_search進行遍歷搜索

在regex_search函數中,會將找到的第一個匹配結果保存到一個smatch類中。

然而若是搜索字符串中有多個匹配結果,則須要本身實現了。ios

在smatch中,有兩個成員,官方文檔以下:express

iterator first:函數

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

iterator second.net

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

因此,使用以下方法,能夠獲得遍歷搜索:blog

 

[cpp]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. #include <string>  
  2. #include <iostream>  
  3. #include <boost\regex.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 plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. 192  
  2. 168  
  3. 1  
  4. 1  

在boost中,還提供了一種迭代器的方法,名稱爲:sregex_iterator,默認構造器會生成一個結束迭代器。用法以下:ip

 

[cpp]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. #include <string>  
  2. #include <iostream>  
  3. #include <boost\regex.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;     } }
相關文章
相關標籤/搜索