Правило для извлечения ключевых + фраз из текстового документа

Я хочу извлечь ключевые фразы из документа: "что-то КЛЮЧЕВАЯ фраза КОНЕЦ что-то... и т. Д.". Мое правило работает хорошо, но результат не содержит имени ключа. Каким должно быть правило, чтобы получить строку: "КЛЮЧЕВАЯ фраза". Спасибо за совет.

std::vector<std::string> doc; 
bool r = qi::phrase_parse(first,last, 
  ( qi::omit[*(qi::char_-"KEY")] 
    >> qi::lexeme[ "KEY"
    >> *(qi::char_-"KEY" -"END")] ) % "END"
, qi::space, doc);

2 ответа

Решение

qi::lit(...) не синтезирует атрибут

qi::string(...) делает.

замещать "KEY" с qi::string("KEY"), скорее всего. (трудно сказать, не зная типа doc)

bool r = qi::phrase_parse(first,last, 
  ( qi::omit[*(qi::char_-"KEY")] 
    >> qi::lexeme[ qi::string("KEY")
    >> *(qi::char_-"KEY" -"END")] ) % "END"
, qi::space, doc);

БОНУС Смотрите также seek[] директива парсера из хранилища духов:

seek[] директива parser пропускает весь ввод до тех пор, пока парсер субъекта не совпадет.

Вот что я бы сделал:

Жить на Колиру

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/repository/include/qi_seek.hpp>
namespace qi = boost::spirit::qi;
namespace qr = boost::spirit::repository::qi;

extern std::string const sample; // below

int main() {
    auto f(sample.begin()), l(sample.end());

    std::vector<std::string> phrases;

    if (qi::parse(f,l, *qi::as_string[
                qr::seek[qi::string("KEY")] >> *(qi::char_ - "END")
            ], phrases)) 
    {
        for (size_t i = 0; i < phrases.size(); ++i) 
            std::cout << "keyphrase #" << i << ": '" << phrases[i] << "'\n";
    }
}

Печать:

keyphrase #0: 'KEY@v/0qwJTjgFQwNmose7LiEmAmKpIdK3TPmkCs@'
keyphrase #1: 'KEY@G1TErN1QSSKi17BSnwBKML@'
keyphrase #2: 'KEY@pWhBKmc0sD+o@'
keyphrase #3: 'KEY@pwgjNJ0FvWGRezwi74QdIQdmUuKVyquWuvXz4tBOXqMMqco@'
keyphrase #4: 'KEY@aJ3QUfLh3AqfKyxcUSiDbanZmCNGza6jb6pZ@'
keyphrase #5: 'KEY@bYJzitZUyXlgPA009qBpleHIJ9uJUSdJO78iisUgHkoqUpf+oXZQF9X/7v2fikgemCD@'

Пример данных, включенных в комментарий в этом ответе: / здесь /

Итоговый тест:

  • Spirit Qi (решение Sahe выше) - Количество предметов: 5585 Истекшее время: 183,676 секунд
  • Boost regex - Количество предметов: 5585 Истекшее время: 197.684 секунд
  • Регулярное выражение Xpressive - Количество элементов: 5585 Истекшее время: 232,597 секунд

Размер данных: 23,9 МБ, текстовый файл

Другие вопросы по тегам