我遇到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)在向量中保存多个名称的最佳方法是什么?
提前致谢
康拉德
答案 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
);
之后,如果result
为true
,则向量names
将包含所有已解析的名称(使用Boost V1.45进行测试)。
答案 2 :(得分:0)
我认为您使用Boost.Spirit而不是STL string的find方法的原因是什么? 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")