2013-03-24 62 views
2

我試圖讓boost :: regex在搜索字符串中給出模式的所有匹配項。認爲這樣的事情會很簡單,但讓它提高和STL在所有內容之上添加10個模糊混淆元層次:)。在字符串迭代器中使用boost :: regex_search()

我最近的嘗試是使用regex_search(),但不幸的是我的調用似乎沒有匹配任何重載。這裏有一個超級蒸例如:

std::string test = "1234567890"; 
boost::regex testPattern("\\d"); 
boost::match_results<std::string::const_iterator> testMatches; 
std::string::const_iterator startPos = test.begin(); 
while(regex_search(startPos, test.end(), testMatches, testPattern)) { 
    // Do stuff: record match value, increment start position 
} 

我調用regex_search()跳智能感知和編譯失敗(「‘regex_search’沒有實例參數列表匹配」)。

我試圖調用過載是:

template <class BidirectionalIterator, 
    class Allocator, class charT, class traits> 
bool regex_search(BidirectionalIterator first, BidirectionalIterator last, 
    match_results<BidirectionalIterator, Allocator>& m, 
    const basic_regex<charT, traits>& e, 
    match_flag_type flags = match_default); 

這似乎符合我的調用罰款。

任何想法感謝!以及做這種事情的替代方法。我最終想要做的是分裂像繩子:

"0.11,0.22;0.33,0.444;0.555,0.666" 

成浮點字符串,然後我就可以解析的組成名單。

在任何其他正則表達式包中它會很簡單 - 通過像「(?:([0-9。] +)[;,]?)+」這樣的表達式運行它,並且捕獲的組將包含結果。

回答

3

這個問題實際上是,你混合迭代器類型(std::string::iteratorstd::string::const_iterator,由於regex_search是一個模板函數,從iteratorconst_iterator隱式轉換是不允許

你是正確的。該聲明test作爲const std::string會解決這個問題,因爲現在test.end()會返回一個const_iterator,而不是iterator

或者,你CA ñ不要做:

std::string test = "1234567890"; 
boost::regex testPattern("\\d"); 
boost::match_results<std::string::const_iterator> testMatches; 
std::string::const_iterator startPos = test.begin(); 
std::string::const_iterator endPos = test.end(); 
while(regex_search(startPos, endPos, testMatches, testPattern)) { 
    // Do stuff: record match value, increment start position 
} 

如果你C++ 11獲得,你也可以使用新的std::string::cend成員:

std::string test = "1234567890"; 
boost::regex testPattern("\\d"); 
boost::match_results<std::string::const_iterator> testMatches; 
std::string::const_iterator startPos = test.begin(); 
while(regex_search(startPos, test.cend(), testMatches, testPattern)) { 
    // Do stuff: record match value, increment start position 
} 
+0

酷,謝謝 - 我會記住這爲答案,這是一個好的解釋發生了什麼。 – QuadrupleA 2013-03-26 00:03:28

+0

很高興你發現它有幫助。我從個人經驗中知道,追查這些「不兼容」的迭代器問題可能令人沮喪,特別是當代碼看起來正確時。我有時使用這種錯誤的形式作爲面試問題。 – 2013-03-26 20:34:19

0

好的,算出了這一個。如果搜索到的字符串被聲明爲「const」,那麼該方法找到正確。例如:

const std::string test = "1234567890";