Boost学习笔记-tokenizer

在实际应用中,字符串分解相当重要,在以前一直没有找到简单的字符串分解的库,一般直接使用MFC的CString进行分词,虽然lex也可以完成这些工作,但是有种杀鸡用牛刀的味道。

最近学习boost,发现boost的tokenizer可以完成这些功能,并且使用起来也相当简单。在boost文档中的一些用例都比较短,也而且也不难扩展,
Tokenizer 类
  template <class TokenizerFunc = char_delimiters_separator<char>,
  class Iterator = std::string::const_iterator,
  class Type = std::string>
  class tokenizer
  其中TokenizerFunc为用于分解的函数对象,Iterator为访问该序列的迭代器类型,Type为字符串类型。
  例子1 使用默认TokenizerFunc的字符串分解
  // simple_example_1.cpp
  #include<iostream>
  #include<boost/tokenizer.hpp>
  #include<string>
  int main(){ 
  using namespace std;
  using namespace boost; 
  string s = "This is,  a test";
  tokenizer<> tok(s);  
  for(tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg)  {  
  cout << *beg << "/n"; 
    }
  }
  在例子1中tokenizer使用了默认的模板,并且使用了默认的TokenizerFunc。其调用的构造函数为
  template<class Container>
    tokenizer(const Container& c,const TokenizerFunc& f = TokenizerFunc())
  例子2
  // char_sep_example_1.cpp
  #include <iostream>
  #include <boost/tokenizer.hpp>
  #include <string>
  int main(){ 
      std::string str = ";;Hello|world||-foo--bar;yow;baz|";
      typedef boost::tokenizer<boost::char_separator<char> >    
      tokenizer;  boost::char_separator<char> sep("-;|");
      tokenizer tokens(str, sep);
      for (tokenizer::iterator tok_iter = tokens.begin();tok_iter != tokens.end(); ++tok_iter) 
        std::cout << "<" << *tok_iter << "> ";
      std::cout << "/n";
      return EXIT_SUCCESS;
  }
  输出结果是:
    <Hello> <world> <foo> <bar> <yow> <baz>
在以上的例子中通过使用char_separator这个TokenizerFunc的实现,来完成更复杂的应用。

如果将tokenizer模板设为宽字符wstring,则可以对中文进行处理
    std::wstring str = _T(";;Hello我是一个兵,|world||-foo--bar;yow;baz|");
    typedef boost::tokenizer<boost::char_separator<wchar_t> ,std::wstring::const_iterator,std::wstring>
        tokenizer;
    boost::char_separator<wchar_t> sep(_T("-;|,是"));
    tokenizer tokens(str, sep);
    std::wcout.imbue(std::locale("chs"));
    for (tokenizer::iterator tok_iter = tokens.begin();
        tok_iter != tokens.end(); ++tok_iter)
        std::wcout << "<" << *tok_iter << "> ";
    std::wcout << "/n";
输出结果是
<Hello我> <一个兵,> <world> <foo> <bar> <yow> <baz>

更多例子可以参见boost 文档

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值