boost-tokenizer学习
tokenizer库是一个专门用于分词(token)的字符串处理库;
可以使用简单易用的方法把一个字符串分解成若干个单词;
tokenizerl类是该库的核心,它以容器的外观提供分词序列;
TokenizerFunc:专门的分词函数对象,默认使用空格和标点分词
- char_delimiters_separator 使用标点符号分词
- char_separator 使用字符集合作为分词符
- escaped_list_separator 使用CSV的逗号分割
- offset_separator 使用偏移量来分词
缺陷:
1、只支持使用单个字符进行分词;
2、对wstring(UNICODE)缺乏完善的考虑;
正则表达式xpressive和string_algo可以提供更好的实现,可以对字符串操作工作的更好!
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
/* tokenizer库是一个专门用于分词(token)的字符串处理库; 可以使用简单易用的方法把一个字符串分解成若干个单词; tokenizerl类是该库的核心,它以容器的外观提供分词序列; TokenizerFunc:专门的分词函数对象,默认使用空格和标点分词 char_delimiters_separator 使用标点符号分词 char_separator 使用字符集合作为分词符 escaped_list_separator 使用CSV的逗号分割 offset_separator 使用偏移量来分词 缺陷: 1、只支持使用单个字符进行分词; 2、对wstring(UNICODE)缺乏完善的考虑; 正则表达式xpressive和string_algo可以提供更好的实现,可以对字符串操作工作的更好! */ /* template < typename TokenizerFunc = char_delimiters_separator<char>, typename Iterator = std::string::const_iterator, typename Type = std::string > class tokenizer { private: typedef token_iterator_generator<TokenizerFunc,Iterator,Type> TGen; // It seems that MSVC does not like the unqualified use of iterator, // Thus we use iter internally when it is used unqualified and // the users of this class will always qualify iterator. typedef typename TGen::type iter; public: typedef iter iterator; typedef iter const_iterator; typedef Type value_type; typedef value_type& reference; typedef const value_type& const_reference; typedef value_type* pointer; typedef const pointer const_pointer; typedef void size_type; typedef void difference_type; tokenizer(Iterator first, Iterator last, const TokenizerFunc& f = TokenizerFunc()) : first_(first), last_(last), f_(f) { } template <typename Container> tokenizer(const Container& c) : first_(c.begin()), last_(c.end()), f_() { } template <typename Container> tokenizer(const Container& c,const TokenizerFunc& f) : first_(c.begin()), last_(c.end()), f_(f) { } void assign(Iterator first, Iterator last){ first_ = first; last_ = last; } void assign(Iterator first, Iterator last, const TokenizerFunc& f){ assign(first,last); f_ = f; } template <typename Container> void assign(const Container& c){ assign(c.begin(),c.end()); } template <typename Container> void assign(const Container& c, const TokenizerFunc& f){ assign(c.begin(),c.end(),f); } iter begin() const { return iter(f_,first_,last_); } iter end() const { return iter(f_,last_,last_); } */ /************************************************************************/ /* C++ stl Library */ /************************************************************************/ #include <iostream> #include <string> /************************************************************************/ /* C++ boost Library */ /************************************************************************/ #include "boost/tokenizer.hpp" #include <boost/typeof/typeof.hpp> using namespace boost; using namespace std; template < typename T> void print(T &tok) { for (BOOST_AUTO(pos, tok.begin()); pos != tok.end(); pos++) { cout << "[" << *pos << "]" ; } cout << endl; } int main( void ) { //char_delimiters_separator string str1 = "I love my town!xian" ; tokenizer<> tok1(str1); //默认使用空格和标点分词 print(tok1); string str2 = "I,love,my,town!" ; tokenizer<> tok2(str2); //默认使用空格和标点分词 print(tok2); //char_separator string str3( "I love my town!xian" ); char_separator< char > sep; tokenizer<char_separator< char > > tok3(str3, sep); print(tok3); string str4 = ";!!;Hello|world||-Michael--Joessy;yoo;handsome|" ; char_separator< char > sep1( "-;|" ); tokenizer<char_separator< char > > tok4(str4, sep1); print(tok4); char_separator< char > sep2( "-;" , "|" , keep_empty_tokens); tokenizer<char_separator< char > > tok5(str4, sep2); print(tok5); //escaped_list_separator string str5 = "aa,Int32,localTag1,23" ; tokenizer<escaped_list_separator< char > > tok6(str5); print(tok6); //offset_separator string str6 = "1225200140023" ; int offsets[] = { 2 , 2 , 4 }; offset_separator f(offsets, offsets + 3 ); tokenizer<offset_separator> tok7(str6, f); print(tok7); cin.get(); return 0 ; } |