gpt4 book ai didi

c++ - Boost spirit语法匹配嘈杂的输入

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

我正在尝试解析嘈杂的输入,理想情况下,我将能够查看节是否与规则匹配,如果它确实获得了我需要的数据并丢弃其余数据。

我要的数据如下

Event: Newstate
Channel: SIP/104-000001bb
ChannelState: 6
ChannelStateDesc: Up

我想确保事件属于新状态。

我需要 channel 状态。其余的我不关心(现在)所以我想忽略它,我希望它灵活并接受重要内容之间的任何旧废话,真的我不想说忽略这一行,而是忽略事件和我捕获值的 channel 状态结束之间的任何内容。

到目前为止我有:

typedef boost::fusion::vector2<std::string, std::string> vect;
qi::rule<std::string::iterator, vect(), space> rule_ =
lit("Event: ") >> *char_("a-zA-Z") >>
qi::omit[ *char_ ] >>
"ChannelState: " >> *char_("0-9") >>
qi::omit[ *char_ ];

但由于某种原因这不起作用,当我这样做时我总是得到错误的返回:

vect v;
bool r=qi::parse(it, str.end(), rule_, v);

编辑:Boost 版本 1.42 编译器 g++ 4.4 Spirit 0x2020

最佳答案

记住:Spirit 的解析器是贪婪的。这意味着如果你做 qi::omit[ <something> ] , 它将继续省略字符直到 <something>不再相遇。自 <something>字面意思是 anything(char_ 匹配任何字符,所以 *char_ 匹配所有字符),它将吃掉整个字符串的其余部分。然后它会引发错误,因为它从未到达“ChannelState:”。

您的方法根本行不通。你必须有一些切断开关来停止 *char_从吃一切。

我不明白你为什么不把它们全部解析成一个 std::map ,而不是零敲碎打。然后你就可以挑选出你想要的元素。你说你还不需要一些元素,所以忽略它们。

这将按如下方式完成:

//Includes
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/adapted/std_pair.hpp>

//Code
using namespace boost::spirit;
using ascii::char_;
using ascii::string;

qi::rule<std::string::iterator, std::pair<std::string, std::string>() > pair_rule =
*(char_ - ':') >> ':' >>
qi::omit[*ascii::space] >>
*(char_ - eol) >> (eol || eoi);

qi::rule<std::string::iterator, std::map<std::string, std::string>() > map_rule =
+pair_rule;

std::map<std::string, std::string> v;
bool r = qi::parse(test.begin(), test.end(), map_rule, v);

请注意,这适用于 Boost 1.47。我怀疑它在早期版本上会失败。

Boost version 1.42 compiler g++ 4.4 Spirit 0x2020

那些都比较老了。你应该考虑升级。 Boost 现在高达 1.47。

关于c++ - Boost spirit语法匹配嘈杂的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8011994/

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