ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – Boost精神语法匹配嘈杂的输入

2019-08-26 18:04:42  阅读:160  来源: 互联网

标签:boost-spirit-qi c boost boost-spirit


我试图解析一个嘈杂的输入,理想情况下,我将能够看到一个节是否匹配规则,如果它确实得到我需要的数据并丢弃其余的.

我想要的数据如下.

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

我想确保事件是否为新状态.

我需要频道状态.其余的我不关心(刚才)所以我想忽略它,我希望它是灵活的,并接受重要的东西之间的任何旧垃圾,真的我不想说忽略这一行,而是忽略事件和通道状态结束之间的任何内容,我捕获值.

到目前为止我有:

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精神0x2020

解决方法:

记住:Spirit的解析器是贪婪的.这意味着如果你做qi :: omit [< something> ],它将继续省略字符,直到< something>不再满足.由于< something>字面上是任何东西(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.

标签:boost-spirit-qi,c,boost,boost-spirit
来源: https://codeday.me/bug/20190826/1732719.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有