使用boost :: regex获取sub-match_results

时间:2011-04-25 18:22:12

标签: c++ regex boost boost-regex

嘿,我想说我有这个正则表达式:(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])将不起作用。

3 个答案:

答案 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_searchregex_matchregex_iterator并使用match_extra标记来调用/使用此功能。

查看对Boost.Regex的引用以获取更多信息。

答案 2 :(得分:3)

在我看来,您需要使用(test[0-9])正则表达式作为输入来创建regex_iterator。然后,您可以使用生成的regex_iterator来枚举原始目标的匹配子字符串。

如果你仍然需要“一个整体匹配”,那么也许这项工作必须与找到匹配的子串的任务分离。你能澄清一下你的要求吗?