【问题标题】:Range-based for-loop over regex matches?正则表达式匹配上的基于范围的for循环?
【发布时间】:2012-10-01 16:04:10
【问题描述】:

在 C++11 的最终草案中,基于范围的 for 循环可以通过一对迭代器指定要迭代的范围。这使得迭代正则表达式的所有匹配变得容易。使用一对迭代器指定范围的能力后来被删除,并且在 C++11 中不存在。是否还有一种直接的方法来迭代特定正则表达式的所有匹配项?我希望能够做这样的事情:

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

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

C++11 支持这种东西吗?

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    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);}
    

    【讨论】:

    • 我会在 make_range() 中为 end=T() 设置一个默认值。这样 istream_iterator-s 和正则表达式迭代器可以使用单个 arg 创建。这是一个相当普遍的成语。
    【解决方案2】:

    您仍然可以使用一对迭代器来指定要迭代的序列。语句for(a: c) 本质上是遍历序列[begin(c), end(c))。因此,您需要做的就是使用 match_results 对象或提供合适的 beginend 函数来返回正则表达式迭代器类型之一。

    【讨论】:

    • std::match_results 提供了 begin 和 end 成员函数,所以 base 已经被覆盖了。
    • @KnowItAllWannabe - 你辜负了你的名字。 已修复。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多