增强精神语法匹配噪声输入
Boost spirit grammar match noisy input
我试图解析一个嘈杂的输入,理想情况下,我将能够看到一个节是否与规则匹配,如果它确实得到我需要的数据并丢弃其余的。
我需要的数据如下:
Event: Newstate
Channel: SIP/104-000001bb
ChannelState: 6
ChannelStateDesc: Up
我想确保事件类型为new state。
我需要通道状态。其余的我不关心(现在),所以我想忽略它,我希望它是灵活的,并接受重要的东西之间的任何旧垃圾,我真的不想说忽略这一行,而是忽略事件和通道结束状态之间的任何东西,我捕获的值。
到目前为止,我得到了:
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_ ];
但由于某些原因,这不起作用,当我这样做时,我总是返回false:
vect v;
bool r=qi::parse(it, str.end(), rule_, v);
编辑:Boost version 1.42 compiler g++ 4.4 Spirit 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 1.42版本编译器g++ 4.4 Spirit 0x2020
那些相当旧了。你应该考虑升级。
相关文章:
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 2D数组来自文本输入,中间有空格
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 检查输入是否不是整数或数字
- 正在尝试了解输入验证循环
- 读取文件并输入到矢量中
- C++如何通过用户输入删除列表元素
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何使用用户输入在C++中正确填充2D数组
- C++MySQL C api用户输入行
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 用户定义函数中的指针和输入
- 如何在C++中检查2D数组中负值的输入验证
- 如何只允许用户输入正整数
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 输入中的字符串数未知(以字母表示)
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 增强精神语法匹配噪声输入