# char_separator<Char, Traits>

`char_separator` クラスは `strtok()` と同じように、 文字列を区切り文字に基づいてトークンに分解する。 (but without all the evils of non-reentrancy and destruction of the input sequence).

`char_separator` クラスは `token_iterator` クラスや `tokenizer` クラスと一緒に使用される。

## Definitions

`strtok()` 関数は出力トークンに区切り文字自体を含まない。 しかし、場合によっては出力トークンに区切り文字自体を含んだ方が便利なこともある。 `char_separator` はその機能をオプションで提供しており、トークンとして出力したい区切り文字は kept delimiters に、出力したくない区切り文字は dropped delimiters に指定すれば良い。

入力文字列中に2つの区切り文字が連続して現れたときは、 空のトークン を出力するか、飛ばして進んでいくかという疑問が発生する。 `strtok()` は飛ばして進んでいくが、 `char_separator` クラスはどちらかを選択することができる。

## Examples

この最初の例は `strtok()` 関数の代替としての `char_separator` の使い方を示している。 区切り文字として3つの文字を指定し、それらの区切り文字は出力トークンの中には含まれない。 また、kept delimiters は指定せず、デフォルトでは空のトークンは無視される。

>     // 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>

次の例は dropped delimiters に '-' と ';' の2つを指定し、 kept delimiters に'|'を指定している。さらに、2つの区切り文字が連続したときに 空のトークンを出力するように指定している。

>     // char_sep_example_2.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("-;", "|", boost::keep_empty_tokens);
>         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` のデフォルトコンストラクタを使用して、 句読点とスペースを区切り文字としてトークンに分解する。

>     // char_sep_example_3.cpp
>     #include <iostream>
>     #include <boost/tokenizer.hpp>
>     #include <string>

>     int main()
>     {
>        std::string str = "This is,  a test";
>        typedef boost::tokenizer<boost::char_separator<char> > Tok;
>        boost::char_separator<char> sep; // default constructed
>        Tok tok(str, sep);
>        for(Tok::iterator tok_iter = tok.begin(); tok_iter != tok.end(); ++tok_iter)
>          std::cout << "<" << *tok_iter << "> ";
>        std::cout << "\n";
>        return EXIT_SUCCESS;
>     }

出力:

>     <This> <is> <,> <a> <test>

## Template parameters

パラメータ | 説明 | デフォルト
--- | --- | ---
`Char` | トークンの要素の型。通常は `char` である。 |
`Traits` | 文字の型の `char_traits` 。 | `char_traits<char>`

## Model of

Tokenizer Function

## Members

    explicit char_separator(const Char* dropped_delims,
                            const Char* kept_delims = "",
                            empty_token_policy empty_tokens = drop_empty_tokens)

トークンに分離するための `token_iterator` や `tokenizer` を生成する際に使用する `char_separator` を生成する。 `dropped_delims` と `kept_delims` はそれぞれ、 トークンに分離する際の区切り文字として使用される文字の文字列である。 入力文字列に区切り文字が見つかると常にトークンはそこで終端となり、次からは新しいトークンとなる。 `dropped_delims` に含まれる区切り文字は出力中にトークンとして現れないのに対し、 `kept_delims` に含まれる区切り文字はトークンとして現れる。 `empty_tokens` が `drop_empty_tokens` である場合は、空のトークンは出力に含まれない。 `empty_tokens` が `keep_empty_tokens` である場合は、空のトークンも出力に含まれる。

    explicit char_separator()

dropped delimiters の識別には `std::isspace()` 関数が使用され、 kept delimiters の識別には `std::ispunct()` 関数が使用される。 また、空のトークンは出力に含まれない。

    template <typename InputIterator, typename Token>
    bool operator()(InputIterator& next, InputIterator end, Token& tok)

この関数はトークンに分離するために `token_iterator` から呼び出される。通常は、使用者がこの関数を直接呼び出すことはない。

© Copyright Jeremy Siek and John R. Bandela 2001-2002. Permission to copy, use, modify, sell and distribute this document is granted provided this copyright notice appears in all copies. This document is provided "as is" without express or implied warranty, and with no claim as to its suitability for any purpose.

Japanese Translation Copyright © 2003 Akihiro Yamasaki
オリジナルの、及びこの著作権表示が全ての複製の中に現れる限り、この文書の複製、利用、変更、販売そして配布を認める。このドキュメントは「あるがまま」に提供されており、いかなる明示的、暗黙的保証も行わない。また、いかなる目的に対しても、その利用が適していることを関知しない。