Declrations
template < class TokenizerFunc, class Type = std::string, class Container = std::vector<Type> > class basic_tokenizer : private container_generator<Container>, public random_accessor<Container>; typedef basic_tokenizer<char_separator<char>, std::string> tokenizer; typedef basic_tokenizer<escape_separator<char>, std::string> csvtokenizer; typedef basic_tokenizer<format_separator<char>, std::string> strftokenizer; #ifdef CLX_USE_WCHAR typedef basic_tokenizer<char_separator<wchar_t>, std::wstring> wtokenizer; typedef basic_tokenizer<escape_separator<wchar_t>, std::wstring> wcsvtokenizer; typedef basic_tokenizer<format_separator<wchar_t>, std::wstring> wstrftokenizer; #endif
Overview
tokenizer は,ポリシークラス (TokenizerFunc) に基づいて, 指定された文字列をトークン文字列群に分割するためのクラスです. boost::tokenizer をベースに実装しています.boost::tokenizer との違いは,分割したトークンをコンテナ (Container<Type>) に格納することによって,分割後の各トークンに対して, ランダムアクセスを行うことができる点です.
TokenizerFunc は,Boost TokenizerFunction と同様のインターフェースを採用しています. そのため,ポリシークラスとして Boost TokenizerFunction を利用することも可能です(逆に, CLXのTokenizerFuncもBoostで利用可能).独自にポリシークラス (TokenizerFunc) を作成する場合には,以下の型およびメソッドを定義する必要があります.標準で実装している TokenizerFunc については,tokenizer_func を参照して下さい.
template <class CharT> class separator { public: typedef CharT char_type; void reset(); template <class InIter, class Token> bool operator()(InIter& next, InIter last, Token& dest); };
Typeに文字列以外の型 (int,long,...) が指定された場合,コンテナに格納する直前に lexical_cast によるキャストを試みます. キャストに失敗した場合には,lexical_cast から例外が送出されます.
Examples
Tokenizer
#include <iostream> #include <string> #include "clx/tokenizer.h" int main(int argc, char* argv[]) { std::string s = "This is, a test"; clx::tokenizer tok(s); for (unsigned int i = 0; i < tok.size(); i++) { std::cout << '<' << tok.at(i) <&tl; "> "; } std::cout << std::endl; return 0; }
Result <This> <is,> <a> <test>
Formatted Tokenizer
#include <iostream> #include "clx/tokenizer.h" int main(int argc, char* argv[]) { std::string s = "23:30:25.030254 IP 192.168.1.2.100 > 192.168.1.3.200: . ack 12 win 256 <XXX>"; std::string fmt = "%s:%s:%s.%s IP %s > %s: %s ack %s win %s <%s>"; clx::format_separator<char> f(fmt); clx::strftokenizer tok(f); tok.assign(s); std::cout << "Member: " << tok.size() << std::endl; for (unsigned int i = 0; i < tok.size(); i++) { std::cout << '<' << tok[i] << "> "; } std::cout << std::endl; return 0; }
Result Member: 10 <23> <30> <25> <030254> <192.168.1.2.100> <192.168.1.3.200> <.> <12> <256> <XXX>
strftokenizer は,C 標準ライブラリの scanf() のように与えられた書式に基づいて文字列を分割します. ただし,書式で与えられた型修飾子は無視し,分割後の各トークンの型はテンプレート引数の Type として認識するので,書式の型修飾子は "s" のみを用いて下さい.
Template Parameters
- TokenizerFunc
- 文字列を分割するためのポリシーを指定します.
- Type
- 分割したトークンの型を指定します.デフォルト値は,std::string
- Container
- Type型のトークンを格納するためのコンテナを指定します.デフォルト値は,std::vector
Related Types
typedef TokenizerFunc functor; typedef typename functor::char_type char_type; typedef std::basic_string<char_type> string_type; typedef Type value_type; typedef Container container;
Construction and Member Functions
explicit basic_tokenizer(functor f = functor()); explicit basic_tokenizer(const string_type& s, functor f = functor()); explicit basic_tokenizer(const char_type* s, functor f = functor()); template <class InIter> basic_tokenizer(InIter first, InIter last, functor f = functor()); virtual ~basic_tokenzier() throw();
コンストラクタには,分割を行う文字列,または文字列のイテレータを指定します. コンストラクタは,assign() メソッドを実行して指定された文字列を分割します. assign() メソッドに関しては後述します.
basic_tokenizer& assign(const string_type& s); basic_tokenizer& assign(const char_type* s); template <class InIter> basic_tokenizer& assign(InIter first, InIter last); void reset();
assign() メソッドは,TokenizerFunc にしたがって指定された文字列を分割します. 分割した文字列は Container で指定されたクラスへ格納されます.tokenizer は, Container クラスを継承しているので,分割された各トークンへのアクセスは Container で提供されている各メソッドを利用して行います.
Container (の継承)に関する詳細は,container_wrapper を参照して下さい.