亲宝软件园·资讯

展开

C++ Boost Tokenizer使用详细讲解

无水先生 人气:0

介绍

库 Boost.Tokenizer 允许您通过将某些字符解释为分隔符来迭代字符串中的部分表达式。使用 boost::tokenizer 迭代字符串中的部分表达式

示例一

使用 boost::tokenizer 迭代字符串中的部分表达式

#include <boost/tokenizer.hpp>
#include <string>
#include <iostream>
int main()
{
  typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
  std::string s = "Boost C++ Libraries";
  tokenizer tok{s};
  for (tokenizer::iterator it = tok.begin(); it != tok.end(); ++it)
    std::cout << *it << '\n';
}

Boost.Tokenizer 在 boost/tokenizer.hpp 中定义了一个名为 boost::tokenizer 的类模板。它期望一个标识连贯表达式的类作为模板参数。示例 10.1 使用了 boost::char_separator 类,它将空格和标点符号解释为分隔符。

必须使用 std::string 类型的字符串初始化标记器。使用成员函数 begin() 和 end(),可以像容器一样访问标记器。用于初始化标记器的字符串的部分表达式可通过迭代器获得。部分表达式的计算方式取决于作为模板参数传递的类的类型。

因为 boost::char_separator 默认将空格和标点符号解释为分隔符,所以示例 10.1 会显示 Boost、C、+、+ 和库。 boost::char_separator 使用 std::isspace() 和 std::ispunct() 来识别分隔符。 Boost.Tokenizer 区分应该显示的分隔符和应该抑制的分隔符。默认情况下,空格被抑制并显示标点符号。

示例二

初始化 boost::char_separator 以适应迭代

#include <boost/tokenizer.hpp>
#include <string>
#include <iostream>
int main()
{
  typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
  std::string s = "Boost C++ Libraries";
  boost::char_separator<char> sep{" "};
  tokenizer tok{s, sep};
  for (const auto &t : tok)
    std::cout << t << '\n';
}

为了防止标点符号被解释为分隔符,请在将 boost::char_separator 对象传递给分词器之前对其进行初始化。

boost::char_separator 的构造函数一共接受三个参数,但只需要第一个。第一个参数描述被抑制的各个分隔符。示例 10.2 与示例 10.1 一样,将空格视为分隔符。

第二个参数指定应显示的分隔符。如果省略此参数,则不显示分隔符,程序现在将显示 Boost、C++ 和库。

示例三

使用 boost::char_separator 模拟默认行为

#include <boost/tokenizer.hpp>
#include <string>
#include <iostream>
int main()
{
  typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
  std::string s = "Boost C++ Libraries";
  boost::char_separator<char> sep{" ", "+"};
  tokenizer tok{s, sep};
  for (const auto &t : tok)
    std::cout << t << '\n';
}

如果将加号作为第二个参数传递,则示例 10.3 的行为类似于示例 10.1。

第三个参数决定是否显示空的部分表达式。如果连续找到两个分隔符,则对应的部分表达式为空。默认情况下,不显示这些空表达式。使用第三个参数,可以更改默认行为。

示例四

初始化 boost::char_separator 以显示空的部分表达式

#include <boost/tokenizer.hpp>
#include <string>
#include <iostream>
int main()
{
  typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
  std::string s = "Boost C++ Libraries";
  boost::char_separator<char> sep{" ", "+", boost::keep_empty_tokens};
  tokenizer tok{s, sep};
  for (const auto &t : tok)
    std::cout << t << '\n';
}

示例 10.4 显示了两个额外的空部分表达式。第一个位于两个加号之间,而第二个位于第二个加号和后面的空格之间。

示例五

具有宽字符串的 Boost.Tokenizer

#include <boost/tokenizer.hpp>
#include <string>
#include <iostream>
int main()
{
  typedef boost::tokenizer<boost::char_separator<wchar_t>,
    std::wstring::const_iterator, std::wstring> tokenizer;
  std::wstring s = L"Boost C++ Libraries";
  boost::char_separator<wchar_t> sep{L" "};
  tokenizer tok{s, sep};
  for (const auto &t : tok)
    std::wcout << t << '\n';
}

Example

示例 10.5 迭代一个 std::wstring 类型的字符串。为了支持此字符串类型,必须使用附加模板参数初始化标记器。类 boost::char_separator 也必须用 wchar_t 初始化。

除了 boost::char_separator 之外,Boost.Tokenizer 还提供了两个额外的类来识别部分表达式。

示例六

使用 boost::escaped_list_separator 解析 CSV 文件

#include <boost/tokenizer.hpp>
#include <string>
#include <iostream>
int main()
{
  typedef boost::tokenizer<boost::escaped_list_separator<char>> tokenizer;
  std::string s = "Boost,\"C++ Libraries\"";
  tokenizer tok{s};
  for (const auto &t : tok)
    std::cout << t << '\n';
}

boost::escaped_list_separator 用于读取以逗号分隔的多个值。这种格式通常称为 CSV(逗号分隔值)。 boost::escaped_list_separator 还处理双引号和转义序列。因此,示例 10.6 的输出是 Boost 和 C++ 库。

提供的第二个类是 boost::offset_separator,它必须被实例化。相应的对象必须作为第二个参数传递给 boost::tokenizer 的构造函数。

示例七

使用 boost::offset_separator 迭代部分表达式

#include <boost/tokenizer.hpp>
#include <string>
#include <iostream>
int main()
{
  typedef boost::tokenizer<boost::offset_separator> tokenizer;
  std::string s = "Boost_C++_Libraries";
  int offsets[] = {5, 5, 9};
  boost::offset_separator sep{offsets, offsets + 3};
  tokenizer tok{s, sep};
  for (const auto &t : tok)
    std::cout << t << '\n';
}

boost::offset_separator 指定字符串中各个部分表达式结束的位置。示例 10.7 指定第一个部分表达式在 5 个字符后结束,第二个在另外 5 个字符后结束,第三个在以下 9 个字符后结束。输出将是 Boost、_C++_ 和库。

加载全部内容

相关教程
猜你喜欢
用户评论