Boost Regex - 匹配的字符串存储在哪里?

时间:2009-04-24 19:09:49

标签: c++ regex boost

我正在编写一个网络蜘蛛,并希望使用boost regex库而不是制作一些复杂的解析函数。

我看了一下这个例子:

#include <string> 
#include <map> 
#include <boost/regex.hpp> 

// purpose: 
// takes the contents of a file in the form of a string 
// and searches for all the C++ class definitions, storing 
// their locations in a map of strings/int's 
typedef std::map<std::string, int, std::less<std::string> > map_type; 

boost::regex expression(
   "^(template[[:space:]]*<[^;:{]+>[[:space:]]*)?"
   "(class|struct)[[:space:]]*"
   "(\\<\\w+\\>([[:blank:]]*\\([^)]*\\))?"
   "[[:space:]]*)*(\\<\\w*\\>)[[:space:]]*"
   "(<[^;:{]+>[[:space:]]*)?(\\{|:[^;\\{()]*\\{)"); 

void IndexClasses(map_type& m, const std::string& file) 
{ 
   std::string::const_iterator start, end; 
   start = file.begin(); 
   end = file.end(); 
      boost::match_results<std::string::const_iterator> what; 
   boost::match_flag_type flags = boost::match_default; 
   while(regex_search(start, end, what, expression, flags)) 
   { 
      // what[0] contains the whole string 
      // what[5] contains the class name. 
      // what[6] contains the template specialisation if any. 
      // add class name and position to map: 
      m[std::string(what[5].first, what[5].second) 
            + std::string(what[6].first, what[6].second)] 
         = what[5].first - file.begin(); 
      // update search position: 
      start = what[0].second; 
      // update flags: 
      flags |= boost::match_prev_avail; 
      flags |= boost::match_not_bob; 
   } 
}

但是,它有点混淆(这是我第一次使用boost;))我似乎无法找到匹配字符串的实际位置。

所以我的问题是 - 如何获得所有比赛的位置?

1 个答案:

答案 0 :(得分:5)

正如代码中的注释所示,[0]包含整个字符串。 那么[0] .first将指向循环的每次迭代中匹配的开始。 一般来说,你可以使用第i组:

string s(what[i].first, what[i].second);

要详细了解class match_results,请查看此link