簡體   English   中英

Boost 正則表達式令牌迭代器:在括號之間獲取輸入

[英]Boost regex token iterator: getting input between parentheses

我正在使用以下 function 和 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 是有問題的正則表達式。 這個 function 工作(事實上,這個可能不起作用,因為我從原來的修改它只是為了使它更簡單,因為 rest 與問題無關)。

我想知道的是,例如,給定這種正則表達式: "Email: (.*?) Phone:..." ,有沒有辦法只檢索(.*?)部分,還是我應該在給定的結果上應用子字符串來實現這一點?

否則,它將丟棄:Email:myemail@domain.com 電話:..

謝謝。

應該使用像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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM