У меня проблемы с 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) как лучше всего сохранить несколько имен в векторе?
заранее спасибо
Конрад





Я полагаю, есть причина, по которой вы используете Boost.Spirit, а не метод найтиSTLнить? Например:
string s = "na me has this and that.\n";
myVector . push_back( s.substr( 0, s.find( "has this and that" ) ) );
Я думаю, это поможет:
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)]
))
Если вы используете более новую версию 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).
Чтобы удалить "имеет то и то", используйте:
qi::lit("has this and that")