C++ Boost Tokenizer使用详细讲解
作者:无水先生
介绍
库 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'; }
示例 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++_ 和库。
到此这篇关于C++ Boost Tokenizer使用详细讲解的文章就介绍到这了,更多相关C++ Boost Tokenizer内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!