Boost regex token迭代器:在括号之间获取输入

Boost regex token iterator: getting input between parentheses

本文关键字:之间 获取 输入 regex token 迭代器 Boost      更新时间:2023-10-16

我使用Boost::tr1::sregex_token_iterator

使用以下函数
int regexMultiple(std::string **s, std::string r)
{
    std::tr1::regex term=(std::tr1::regex)r;
    const std::tr1::sregex_token_iterator end;
    int nCountOcurrences;
    std::string sTemp=**s;
    for (std::tr1::sregex_token_iterator i(sTemp.begin(),sTemp.end(), term); i != end; ++i)
    {
        (*s)[nCountOcurrences]=*i;
        nCountOcurrences++;
    }
    return nCountOcurrences;
}

可以想见,**s是一个指向字符串的指针,r是正在讨论的正则表达式。这个函数可以工作(事实上,这个一个可能不起作用,因为我修改了它,只是为了使它更简单,考虑到其余部分与问题无关)。

我想知道的是,例如,给定这样的正则表达式:"Email: (.*?) Phone:...",是否有任何方法可以从中检索(.*?)部分,或者我应该在给定的结果上应用子字符串来实现这一点?

否则,它会抛出:Email: myemail@domain.com Phone: ..

谢谢。

应该像Kerrek SB那样使用regex_search: http://www.boost.org/doc/libs/1_39_0/libs/regex/doc/html/boost_regex/ref/regex_search.html

int regexMultiple(std::string **s, std::string r)
{
    std::tr1::regex term=(std::tr1::regex)r;
    std::string::const_iterator start, end;
    boost::match_results<std::string::const_iterator> what;
    int nCountOcurrences=0;
    std::string sTemp=**s;
    start=sTemp.begin();
    end=sTemp.end();
    boost::match_flag_type flags = boost::match_default; 
    while (regex_search(start,end, what, term, flags))
    {
        (*s)[nCountOcurrences]=what[1];
        nCountOcurrences++;
        start = what[0].second;
        flags |= boost::match_prev_avail;
        flags |= boost::match_not_bob;
    }
    return nCountOcurrences;
}