提升精神提取第一个单词并将其存储在向量中

时间:2008-12-13 16:54:41

标签: c++ boost boost-spirit

我遇到Boost.Spirit解析字符串的问题。

字符串看起来像

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

我必须提取名字。文本“有这个和那个”总是相同但名称可以由空格组成,因此我不能使用graph_p。

1)如何解析这样的字符串?

由于字符串有几行格式,我必须将名称存储在向量中。

我使用了像

这样的东西
std::string name;
rule<> r = *graph_p[append(name)];

用于保存一个名称,但

2)在向量中保存多个名称的最佳方法是什么?

提前致谢

康拉德

4 个答案:

答案 0 :(得分: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)]
     ))

答案 1 :(得分: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
);

之后,如果resulttrue,则向量names将包含所有已解析的名称(使用Boost V1.45进行测试)。

答案 2 :(得分:0)

我认为您使用Boost.Spirit而不是STL stringfind方法的原因是什么? E.g:

string s = "na me has this and that.\n";
myVector . push_back( s.substr( 0, s.find( "has this and that" ) ) );

答案 3 :(得分:0)

要删除“有这个和那个”,请使用:

qi::lit("has this and that")