2011-12-13 15 views
1

、私は次のように何かをしたいと思います:C++分割文字列C++で

Split on substring

しかし、私は上の分割する1つののサブストリングより複数指定したいと思います。たとえば、 "fda"、 "hi"、 "lkj"、 "4"の文字列に "fda + hifoolkjba4"という文字列の "+"、 "foo"、 "ba"を分割したいとします。助言がありますか?好ましくはSTLとBoostの中で(私がそれを避けることができれば、Qtフレームワークまたは追加のライブラリを組み込む必要はありません)。

答えて

3

<regex>または<boost/regex.hpp>のいずれかの正規表現を使用します。あなたが必要とする正規表現は、(.*?)(\+|foo|ba)(そして最後のトークンに加えて)のようなものになります。

std::string str(argv[1]); 

    boost::regex r("(.*?)(\\+|foo|ba)"); 
    boost::sregex_iterator rt(str.begin(), str.end(), r), rend; 

    std::string final; 

    for (; rt != rend; ++rt) 
    { 
    std::cout << (*rt)[1] << std::endl; 
    final = rt->suffix(); 
    } 
    std::cout << final << std::endl; 
+0

おかげでコンパイルされたライブラリは、私のMac上でとてもうまく機能しないので、私は、ブースト正規表現を使用しての、あまりにも熱心ではありませんよ。私はそれらを動作させることができますが、私は自分のdynlibファイル(実行可能ディレクトリまたは指定されたディレクトリのいずれかを指す必要があります - 私の仕事をスタンドアロン形式で配布するのには理想的ではありません)。 – daj

+0

@daj:現代のコンパイラを入手し、標準ライブラリの ''を使ってください:-)同じインタフェースです。 'boost'を' std'に変更するだけです。 –

+0

それは素晴らしいです、私はそれが今標準ライブラリにあったことを認識しませんでした。私はこれを行うためにBoostのsplit_regex()関数を好んでいます(繰り返しは1ライナーに置き換えられます)。これは追加されていないようです:-( – daj

1

私はブーストでの正規表現サポートを使用することをお勧め:

はここでカットダウン例ブーストを使用しています。例については、hereを参照してください。ここ

は、文字列を分割することができますサンプルコードです:

#include <iostream> 
#include <boost/regex.hpp> 

using namespace std;  

int main() 
{ 

    boost::regex re("(\\+|foo|ba)"); 
    std::string s("fda+hifoolkjba4"); 

    boost::sregex_token_iterator i(s.begin(), s.end(), re, -1); 
    boost::sregex_token_iterator j; 
    while (i != j) { 
     std::cout << *i++ << " "; 
    } 
    std::cout << std::endl; 
    return 0; 
} 
関連する問題