CLX C++ Libraries
Home >> tokenizer

Declrations

template <
    class TokenizerFunc,
    class Type = std::string,
    class Container = std::vector<Type>
>
class basic_tokenizer;

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 InputIterator, class Token>
    bool operator()(InputIterator& next, InputIterator 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;
typedef typename container::size_type size_type;
typedef typename container::const_iterator const_iterator;
typedef typename container::iterator iterator;

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 InputIterator>
explicit basic_tokenizer(InputIterator first, InputIterator last,
    functor f = functor());

virtual ~basic_tokenzier();

コンストラクタには,分割を行う文字列,または文字列のイテレータを指定します. 分割した文字列は Container で指定されたクラスへ格納されます.tokenizer は, Container クラスを継承しているので,分割された各トークンへのアクセスは Container で提供されている各メソッドを利用して行います.

const container& assign(const string_type& s);
const container& assign(const char_type* s);

template <class InputIterator>
const container& assign(InputIterator first, InputIterator last);

virtual void reset();

assign() メソッドは,結果を格納したコンテナを返します.

const value_type& operator[](size_type pos) const;
const value_type& at(size_type pos) const;
const value_type& front() const;
const value_type& back() const;

bool empty() const;
size_type size() const;

const_iterator begin() const;
const_iterator end() const;
const_iterator rbegin() const;
const_iterator rend() const;

const container& data() const;

assign() メソッドによって分割されたトークンへアクセスするためのメソッド群です. トークンは読み取り専用で,値の変更等を行うことはできません.

Related Pages

  1. CLX C++ Libraries - tokenizer_func

References

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