2009-08-09 21 views
11

私はboost :: tokenizerを探していましたが、ドキュメントが非常に薄いことがわかりました。 "イルカ - モンキー - ヒヒ"のような文字列をトークン化し、すべての単語をトークンにすることは可能ですか?これらの例から、私は一文字区切り文字が許されているのを見ただけです。ライブラリはより複雑な区切り文字のために十分に進んでいないのですか?boost :: tokenizerを文字列区切り文字で使用する

+1

トークナイザ通常のブーストのように、

boost::tokenizer<FindStrTFunc> tok("some input...some other input"); 

と使用を作成することができた後? –

+0

私はそれが少し拡散している場合に私の質問を明確にすることが他人に許されると考えました。おそらく、次回までそれを読んでおくべきでしょう。 – Martin

答えて

0

自分の好きなことをするには、自分でTokenizerFunctionと書く必要があります。

+0

私は参照してください。あらかじめ作られたものがあることを期待していましたが、私はあまりにも多くのことを望んでいたと思います。 – Martin

1

1つの方法は、boost :: regexを試すことです。カスタムトークナイザと比較してパフォーマンスが不明です。

std::string s = "dolphin--monkey--baboon"; 

boost::regex re("[a-z|A-Z]+|--"); 
boost::sregex_token_iterator iter(s.begin(), s.end() , re, 0); 
boost::sregex_token_iterator end_iter; 

while(iter != end_iter) 
{ 
    std::cout << *iter << '\n'; 
    ++iter; 
} 
+0

これはいいですね。それが動作すれば、それは私の投票を得る。 :) –

10

iter_splitを使用すると、複数の文字トークンを使用できます。 次のコードは生成します以下:

イルカ
月-キー
ヒヒ

#include <iostream> 
#include <boost/foreach.hpp> 
#include <boost/algorithm/string.hpp> 
#include <boost/algorithm/string/iter_find.hpp> 

    // code starts here 
    std::string s = "dolphin--mon-key--baboon"; 
    std::list<std::string> stringList; 
    boost::iter_split(stringList, s, boost::first_finder("--")); 

    BOOST_FOREACH(std::string token, stringList) 
    {  
     std::cout << token << '\n'; ; 
    } 
+1

これは、文字列全体のコピーを作成するという欠点があります。トークン化された文字列が大きい場合、これは問題です。ブーストトークナイザはこれをしません。 –

2

私はテーマはかなり古いですけど、それは、Googleのトップのリンクに示されているIとき

はので、私は念のために、TokenizerFunctionの私のバリアントを追加します検索「文字列でトークナイザ後押し」

これはコミュニティのwikiをマークされているなぜ我々は興味があるだけ

+0

実装は理想的ではありません(バグを持つ可能性があります)。 – Alek86

関連する問題