嘿,我想说我有这个正则表达式:(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])
将不起作用。
答案 0 :(得分:10)
我认为Dot Net能够制作单个捕获组集合,以便(grp)+将在group1上创建一个集合对象。 boost引擎的regex_search()就像任何普通的匹配函数一样。你坐在while()循环中,匹配最后一个匹配的模式。您使用的表单不使用bid-itterator,因此该函数不会启动最后一场比赛停止的下一场比赛。
您可以使用itterator表格:
(编辑 - 您还可以使用令牌迭代器,定义要迭代的组。在下面的代码中添加。)
#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
test2
test3
test0
答案 1 :(得分:6)
Boost.Regex为这个功能提供了实验支持(称为重复捕获);但是,由于它的性能很高,默认情况下会禁用此功能。
要启用重复捕获,您需要重建Boost.Regex并在所有翻译单元中定义宏BOOST_REGEX_MATCH_EXTRA
;最好的方法是在boost / regex / user.hpp中取消注释这个定义(参见the reference,它位于页面的最底部)。
使用此定义进行编译后,您可以通过使用regex_search
,regex_match
和regex_iterator
并使用match_extra
标记来调用/使用此功能。
查看对Boost.Regex的引用以获取更多信息。
答案 2 :(得分:3)
在我看来,您需要使用(test[0-9])
正则表达式作为输入来创建regex_iterator。然后,您可以使用生成的regex_iterator
来枚举原始目标的匹配子字符串。
如果你仍然需要“一个整体匹配”,那么也许这项工作必须与找到匹配的子串的任务分离。你能澄清一下你的要求吗?