2

Boostの正規表現ライブラリを使用して、ラベルと数字を含む文字列をトークンに分離したいと思います。たとえば、'abc1def002g30'に分割され{'abc','1','def','002','g','30'}ます。Boostのドキュメントに記載されている例を変更して、次のコードを作成しました。

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

using namespace std;

int main(int argc,char **argv){
    string s,str;
    int count;
    do{
        count=0;
        if(argc == 1)
        {
            cout << "Enter text to split (or \"quit\" to exit): ";
            getline(cin, s);
            if(s == "quit") break;
        }
        else
            s = "This is a string of tokens";

        boost::regex re("[0-9]+|[a-z]+");
        boost::sregex_token_iterator i(s.begin(), s.end(), re, 0);
        boost::sregex_token_iterator j;
        while(i != j)
        {
            str=*i;
            cout << str << endl;
            count++;
            i++;
        }
        cout << "There were " << count << " tokens found." << endl;

    }while(argc == 1);
    return 0;
}

保存されているトークンの数countは正しいです。ただし、*it空の文字列のみが含まれているため、何も出力されません。私が間違っていることについて何か推測はありますか?

編集:以下に提案されている修正に従って、コードを変更しましたが、正しく機能するようになりました。

4

1 に答える 1

2

sregex_token_iterator のドキュメントから:

効果: 一致フラグ m (match_flag_type を参照) を使用して、シーケンス [a,b) 内で見つかった式 re の正規表現一致ごとに 1 つの文字列を列挙する regex_token_iterator を構築します。列挙された文字列は、見つかった各一致のサブ式サブマッチです。submatch が -1 の場合、式 re に一致しなかったすべてのテキスト シーケンスを列挙します(つまり、フィールド分割を実行します)。

正規表現はすべての項目に一致するため (文字列のみに一致したサンプル コードとは異なり)、空の結果が得られます。

0 に置き換えてみてください。

于 2011-05-24T17:13:03.893 に答える