C++11 regex_token_iterator

C++11 regex_token_iterator

本文关键字:iterator token C++11 regex      更新时间:2023-10-16

嗯。。。我以为我理解正则表达式,也以为我理解迭代器,但C++11的正则表达式实现让我感到困惑。。。

我不理解的一个方面是:在阅读regex令牌迭代器时,我发现了以下示例代码:

#include <fstream>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <regex>
int main()
{
   std::string text = "Quick brown fox.";
   // tokenization (non-matched fragments)
   // Note that regex is matched only two times: when the third value is obtained
   // the iterator is a suffix iterator.
   std::regex ws_re("\s+"); // whitespace
   std::copy( std::sregex_token_iterator(text.begin(), text.end(), ws_re, -1),
              std::sregex_token_iterator(),
              std::ostream_iterator<std::string>(std::cout, "n"));
   ...
}

我不明白以下输出是如何的:

Quick
brown
fox.

是由上面的std::copy()函数创建的。我看不到循环,所以我对迭代是如何发生的感到困惑。或者换言之,多行输出是如何生成的?

std::copy将元素从输入范围复制到输出范围。在程序中,输入范围是使用正则表达式分隔符提取的三个标记。这是打印到输出中的三个单词。输出范围是ostream_iterator,它简单地获取给定的每个元素并将该元素写入输出流。

如果您使用调试器逐步执行std::copy,您将看到它在输入范围的元素上循环。