加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用boost :: regex获取sub-match_results

发布时间:2020-12-16 10:43:08 所属栏目:百科 来源:网络整理
导读:嘿,让我说我有这个正则表达式:(测试[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"; 现在,[1]将是test0(最后一次出现).让
嘿,让我说我有这个正则表达式:(测试[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";

现在,[1]将是test0(最后一次出现).让我们说我需要得到test1,2和3:我该怎么办?

注意:真正的正则表达式非常复杂,并且必须保持一个整体匹配,因此将示例正则表达式更改为(test [0-9])将不起作用.

解决方法

我认为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,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;
}

输出:

TEST1TEST2TEST3TEST0

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读