使用boost::regex获取sub-match_results

Getting sub-match_results with boost::regex

本文关键字:results sub-match regex boost 使用 获取      更新时间:2023-10-16

嘿,假设我有一个正则表达式:(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- iterator,因此该函数不会在上次匹配停止的地方开始下一个匹配。

可以使用迭代器的形式:
(编辑 -你也可以使用标记迭代器,定义要迭代的组。添加在下面的代码中)。

#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

Regex为这个特性提供了实验性的支持(称为重复捕获);但是,由于它对性能的影响很大,因此默认情况下禁用此功能。

要启用重复捕获,需要重新构建Boost。Regex和定义宏BOOST_REGEX_MATCH_EXTRA在所有翻译单元;最好的方法是取消boost/regex/user.hpp中的这个定义的注释(请参阅参考资料,它位于页面的最底部)。

一旦用这个定义编译,你可以通过调用/using regex_search, regex_matchregex_iterator使用match_extra标志来使用这个特性。

检查Boost的引用。

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

如果你仍然需要"一个整体匹配",那么也许这项工作必须从寻找匹配子字符串的任务中解耦。你能说明一下你的那部分要求吗?