2011-07-13 71 views
0

我使用的是提振以下功能:: 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 protected]電話:..

感謝。

+2

爲什麼不直接使用'regex_search'?你可以把所有的捕獲組以一個很好的包返回給你。或者你想要任意多個捕獲組?此外,'** s'不是一個指向字符串的指針,它是一個字符串(而's'是一個指向字符串的指針) - 爲什麼不使用引用? –

+0

看起來我一直在做錯誤的方式,對吧?我會研究這個功能。謝謝。 – Filgera

+1

我認爲這應該有一個簡單的解決方案,讓我重讀你的問題。我不完全確定你想要做什麼。 –

回答

2

應該使用regex_search像Kerrek SB推薦來代替: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; 
} 
+0

很酷。儘管如此,你可以在語法上簡化代碼。讓我知道你是否想要一些指針。 –

+0

當然。儘管這不是我最終的代碼,但是我添加/刪除了一些內容 – Filgera

+0

我應該在帖子中追加一個版本嗎? –