3

Boost.Spirit による文字列の解析に問題があります。

文字列は次のようになります

name1 has this and that.\n 
name 2 has this and that.\n 
na me has this and that.\n 

名前を抽出する必要があります。"has this and that" というテキストは常に同じですが、名前がスペースで構成されている可能性があるため、graph_p を使用できません。

1) そのような文字列を解析するにはどうすればよいですか?

文字列にはその形式の行がいくつかあるため、名前をベクトルに格納する必要があります。

私は次のようなものを使用しました

std::string name;
rule<> r = *graph_p[append(name)];

1つの名前を保存するためですが、

2) 複数の名前をベクトルに保存する最良の方法は?

前もって感謝します

コンラッド

4

4 に答える 4

4

これでうまくいくと思います:

vector<string> names;
string name;
parse(str,
    *(  
       (*(anychar_p - "has this and that.")) [assign_a(name)]
       >> "has this and that.\n") [push_back_a(names, name)]
     ))
于 2008-12-13T22:18:11.890 に答える
2

新しい Spirit V2.x (Boost V1.42 以降のデフォルト) を使用する場合、これは次のように簡単です。

#include <boost/spirit/include/qi.hpp>

namespace qi = boost::spirit::qi;

std::vector<std::string> names;
std::string input = "name1 has this and that.\n"
                    "name 2 has this and that.\n"
                    "na me has this and that.\n";
bool result = qi::parse(
    input.begin(), input.end(),
    *(*(qi::char_ - " has this and that.\n") >> " has this and that.\n"),
    names
);

その後、resultistrueの場合、ベクトルnamesは解析されたすべての名前を保持します (Boost V1.45 でテスト済み)。

于 2010-12-17T15:01:10.417 に答える
0

STL文字列findメソッドではなくBoost.Spiritを使用しているのには理由があると思いますか?例えば:

string s = "na me has this and that.\n";
myVector . push_back( s.substr( 0, s.find( "has this and that" ) ) );
于 2008-12-13T21:10:27.923 に答える
0

「これとあれを持っている」を削除するには、次を使用します。

qi::lit("has this and that")
于 2011-03-02T03:17:02.673 に答える