基于范围的正则表达式匹配的 for 循环

Range-based for-loop over regex matches?

本文关键字:正则表达式 for 循环 于范围 范围      更新时间:2023-10-16

在 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 中是否支持这种事情?

std::pair这样做的问题在于,它"适用于"许多无效范围的事情。从而导致错误。

C++11 没有为此提供内置解决方案。您可以使用Boost.Range的make_iterator_range工具轻松构建一个。再说一次,手动完成并不难:

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

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