gpt4 book ai didi

c++ - 使用 Boost Spirit 来解析一个文本文件,同时跳过它的大部分内容

转载 作者:太空狗 更新时间:2023-10-29 21:21:21 26 4
gpt4 key购买 nike

我有以下 std::string :

<lots of text not including "label A" or "label B">    
label A: 34
<lots of text not including "label A" or "label B">
label B: 45
<lots of text not including "label A" or "label B">
...

我想提取所有出现的 label A 之后的单个整数或 label B并将它们放在相应的 vector<int> a, b 中.一种简单但不优雅的方法是使用 find("label A")find("label B")并解析以先到者为准。有没有一种用Spirit来表达的简洁的方式?你如何跳过除label A以外的所有内容?或 label B

最佳答案

你可以

omit [ eol >> *char_ - ("\nlabel A:") ] >> eol

示例: Live On Coliru

还有 seek[]存储库中的指令。下面等价于上面的:

 repo::seek [ eol >> &lit("int main") ] 

这是一个解析原始样本的样本:

*repo::seek [ eol >> "label" >> char_("A-Z") >> ':' >> int_ ],

这将解析为 std::vector<std::pair<char, int> >没有别的。

On Coliru Too :

#if 0
<lots of text not including "label A" or "label B">
label A: 34
<lots of text not including "label A" or "label B">
label B: 45
<lots of text not including "label A" or "label B">
...
#endif
#include <boost/fusion/adapted/std_pair.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/spirit/repository/include/qi_seek.hpp>
#include <fstream>

namespace qi = boost::spirit::qi;
namespace repo = boost::spirit::repository::qi;

int main()
{
std::ifstream ifs("main.cpp");
ifs >> std::noskipws;

boost::spirit::istream_iterator f(ifs), l;

std::vector<std::pair<char, int> > parsed;
using namespace qi;
bool ok = phrase_parse(
f, l,
*repo::seek [ eol >> "label" >> char_("A-Z") >> ':' >> int_ ],
blank,
parsed
);

if (ok)
{
std::cout << "Found:\n";
for (auto& p : parsed)
std::cout << "'" << p.first << "' has value " << p.second << "\n";
}
else
std::cout << "Fail at: '" << std::string(f,l) << "'\n";
}

注意事项:

输出是

Found:
'A' has value 34
'B' has value 45

关于c++ - 使用 Boost Spirit 来解析一个文本文件,同时跳过它的大部分内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22651608/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com