gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:49:20 28 4
gpt4 key购买 nike

我正在编写一个网络爬虫,并希望使用 boost 正则表达式库而不是编写一些复杂的解析函数。

我看了一下这个例子:

#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 ;))而且我似乎无法找到匹配字符串的实际位置。

所以我的问题是 - 如何获取所有匹配项的位置?

最佳答案

如代码中的注释所示,what[0] 包含整个字符串。所以 what[0].first 将指向循环的每次迭代中的匹配开始。通常,要获得第 i 个组,您可以使用:

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

要了解更多关于 match_results 类的信息,请查看 link .

关于c++ - Boost Regex - 匹配的字符串存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/787164/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com