повысить дух, извлекая первое слово и сохранить его в векторе - PullRequest
3 голосов
/ 13 декабря 2008

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

Заранее спасибо

Konrad

Ответы [ 4 ]

4 голосов
/ 14 декабря 2008

Я думаю, что это поможет:

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)]
     ))
2 голосов
/ 17 декабря 2010

Если вы используете более новый 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).

0 голосов
/ 02 марта 2011

Чтобы удалить «имеет это и то», используйте:

qi::lit("has this and that")
0 голосов
/ 14 декабря 2008

Я полагаю, что есть причина, по которой вы используете Boost.Spirit , а не STL string * find ? Например:

string s = "na me has this and that.\n";
myVector . push_back( s.substr( 0, s.find( "has this and that" ) ) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...