c++ - 从文本文档中提取键+短语的规则

标签 c++ parsing boost-spirit-qi

我想从文档中提取关键短语:“something KEY phrase END something ... ect”。我的规则运行良好,但结果不包含键名。获取字符串的规则应该是什么:“KEY phrase”。谢谢你的建议。

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);

最佳答案

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[] parser directive 来自 Spirit Repository:

The seek[] parser-directive skips all input until the subject parser matches.

这是我要做的:

Live On Coliru

#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@'

此答案的评论中包含的示例数据:/此处/

关于c++ - 从文本文档中提取键+短语的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27768945/

相关文章:

c++ - 对象在将其指针转换为基数后未调用好的方法

c++ - 获取迭代次数?

javascript - 在 Quill 中,如何解析增量并替换其部分内容

linux - 根据编号将名称中带有数字的文件中的数据解析为单个文件

java - 使用 ANTLR 语法进行 Verilog 解析

c++ - Boost.Spirit.Qi - 针对原始数据类型的边界检查

c++ - 检索具有多个重叠 I/O 请求的缓冲区

c++ - std::string(size, '\0') 和 s.resize(size) 的区别?

c++ - 在 python 中公开 C++ 函数并在 C++ 中嵌入 python