CLX C++ Libraries
Home >> tokenizer

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

example_tokenizer.cpp

#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

example_strftokenizer.cpp

#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 を参照して下さい.

Related Pages

  1. CLX C++ Libraries - tokenizer_func
  2. CLX C++ Libraries - container_wrapper

References

  1. Boost C++ Libraries - Boost Tokenizer Overview
  2. Boost C++ Libraries - TokenizerFunction Concept