2012-10-11 56 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 - 你已经辜负了你的名字。 固定。谢谢。 –