2012-04-18 6 views
1

私はこれらのようなSTDの文字列を持っている:「セパレータ」がデータの一部になるパースストリング?

ユーザー名:メッセージ

最初のを見て、それは簡単な問題のように見えますが、この問題は可能性があり、その名前の最後の文字である「:」と最初の文字を文字列のメッセージ部分の ':'でもかまいません。ユーザーは名前にスペースを入れることもできます。

したがって、ユーザーが名前「いくつかの名前:」あるかもしれない私が持っているん

とメッセージを入力可能性があります 「こんにちは、いくつかの名前を:::」:次のようになり

「こんにちは」をユーザー名のリスト(ベクトル)。

このように、このような文字列からユーザー名を抽出する方法はありますか? (理想的には、ユーザーのリストを反復することなく)

おかげ

+0

少なくとも、問題が単純なケースと複雑なケースに分かれるのは、 '': ''が1つしかないかどうかをチェックすることです。 – twain249

+0

メッセージはどのように分離されていますか?とともに ':'? – AlexTheo

+0

':'付き サンプル: あなた:考える: – jmasterx

答えて

1

(\w+?):\ \w+ようregexをお試しください。

+1

問題は根本的にあいまいです。 "name::Hello"と指定すると、追加のコロンが名前の末尾かメッセージの先頭かを判断する方法はありません。正規表現は、実装がどれほど貪欲であるかによって、どちらか一方を選択します。 –

+0

まあ...ほとんどの正規表現の実装はかなり決定的です。貪欲は最初のチャンスで、最初は貪欲ではない。 – nes1983

1

ユーザ名に「:」文字が含まれていないことを確認できず、チェックするたびにリスト全体を反復しないようにしたい場合は、ショートカットを試すことができます。

特殊文字を含むユーザー名のみのベクトルを保持します(これはすべてのユーザー名の一部です)。それらを最初にチェックします。一致するものが見つかった場合は、[username]の後の文字列を取ってください:。それ以外の場合は、単純にコロンで分割することができます。

0

私はこのに近づくような方法は、単に最初のコロンを見つけることです

string text = "token, test string"; 

char_separator<char> sep(":"); 
tokenizer< char_separator<char> > tokens(text, sep); 
BOOST_FOREACH(string t, tokens) 
{ 
    cout << t << "." << endl; 
} 
0

文字列トークンを使用します。そこに文字列を分割し、残りの2つの文字列をトリミングします。

なぜ、追加のコロンがあるのか​​、それらが値の一部であるのか、私には完全には分かりません。削除する必要がある場合は、削除する必要があります。

関連する問題