2012-10-11 74 views
4

在C++ 11的預決定草稿中,基於範圍的for循環可以指定要通過一對迭代器迭代的範圍。這使得遍歷正則表達式的所有匹配變得很容易。使用一對迭代器指定範圍的能力後來被刪除,並且它不存在於C++ 11中。對於特定的正則表達式,是否仍然有一種直接的方法來迭代所有匹配項?我希望能夠做到這樣的事情:基於範圍的for循環正則表達式匹配?

std::regex begin(" 1?2?3?4* "); 
std::regex end; 

for(auto& match: std::pair(begin, end)) process(*match); 

在C++ 11中是否支持這種類型的東西?

回答

7

std::pair這樣做的問題在於,它對許多無效範圍內的東西「起作用」。從而導致錯誤。

C++ 11沒有爲此提供內置解決方案。您可以使用Boost.Range's make_iterator_range facility to build one easily。然後再次手動完成並不困難:

template<typename T> 
class IterRange 
{ 
    T start; 
    T end; 
public: 
    IterRange(const T &start_, const T &end_) : start(start_), end(end_) {} 

    T begin() {return start;} 
    T end() {return end;} 
}; 

template<typename T> IterRange<T> make_range(const T &start, const T &end) {return IterRange<T>(start, end);} 
+1

我會在make_range()中爲end = T()設置一個默認值。這樣istream_iterator-s,實際上正則表達式迭代器可以使用單個arg創建。這是一個相當常見的成語。 – cristicbz

0

您仍然可以使用一對迭代器指定要迭代的序列。聲明for(a: c)實質上遍歷序列[begin(c), end(c))。因此,您只需使用match_results對象或提供合適的beginend函數,該函數返回正則表達式迭代器類型之一。

+0

std :: match_results提供開始和結束成員函數,因此基礎已經被覆蓋。 – KnowItAllWannabe

+0

@KnowItAllWannabe - 你已經辜負了你的名字。 固定。謝謝。 –