嘿,假设我有这个正则表达式:(test[0-9])+
我将其与:test1test2test3test0
const bool ret = boost::regex_search(input, what, r);
for (size_t i = 0; i < what.size(); ++i)
cout << i << ':' << string(what[i]) << "\n";
现在,what[1]
将是 test0
(最后一次出现)。假设我还需要获取 test1
、2 和 3:我应该怎么做?
注意:真正的正则表达式非常复杂并且必须保持一个整体匹配,因此将示例正则表达式更改为 (test[0-9])
将不起作用。
最佳答案
我认为 Dot Net 有能力制作单个捕获组集合,以便 (grp)+ 将在 group1 上创建一个集合对象。 boost 引擎的 regex_search() 将与任何普通匹配函数一样。你坐在一个 while() 循环中匹配最后一个匹配停止的模式。您使用的表单没有使用 bid-itterator,因此该函数不会在上一场比赛结束的地方开始下一场比赛。
您可以使用迭代器形式:
(编辑 - 您还可以使用 token 迭代器,定义要迭代的组。在下面的代码中添加)。
#include <boost/regex.hpp>
#include <string>
#include <iostream>
using namespace std;
using namespace boost;
int main()
{
string input = "test1 ,, test2,, test3,, test0,,";
boost::regex r("(test[0-9])(?:$|[ ,]+)");
boost::smatch what;
std::string::const_iterator start = input.begin();
std::string::const_iterator end = input.end();
while (boost::regex_search(start, end, what, r))
{
string stest(what[1].first, what[1].second);
cout << stest << endl;
// Update the beginning of the range to the character
// following the whole match
start = what[0].second;
}
// Alternate method using token iterator
const int subs[] = {1}; // we just want to see group 1
boost::sregex_token_iterator i(input.begin(), input.end(), r, subs);
boost::sregex_token_iterator j;
while(i != j)
{
cout << *i++ << endl;
}
return 0;
}
输出:
test1
测试2
test3
测试0
关于c++ - 使用 boost::regex 获取子匹配结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5781609/