道高一尺魔高一丈,记强大的boost regex

    做软件免不了和各种开放的私有的协议打交道,有的时候遇到不走寻常路的protocol,那就真的不能走寻常路了,勇敢的掏出利器,让领导哭吧^_^

    言归正传,一个Kuwait项目中,client和server之间个性化的定义了一个协议,协议版本还是DRAFT的,大家就开工了,除了做client,boss还希望做一个模拟的server,这样调试方便。难点是,协议基于二进制数据流,数据流中可选域很多,不同类型的报文之间,没有明显的规律可循,并且client发给server的报文,比server反馈的报文复杂很多(俺摊上做server,解析client报文,oh 那个 my~...)

    好消息是手里有基于VC6的一个模拟server,处理其他协议的,除了协议部分,其它的内容可以借用,比如tcp和串口通信、主要的UI等等。啃文档、人工解析报文后发现,顺序解析起来要考虑的事情太多,头部向后解析一些,尾部向前解析一些,剩下的中间部分再解析一下,这样似乎比较容易,正所谓掐头去尾留中间,转念一想,这不正是正则表达式的强项么,VC环境,想不到boost都难,于是乎剩下的事情都比较顺其自然了,一次美好的MFC+boost的体验。

  限于是公司项目,就不能上实例了,大概的思路

  (1)VC6配置boost lib,拜google

  (2)boost + stl string试验,拜google + conding

  (3)人工解析的报文,换用boost regex解析测试

  (4)交工,功能可以,维护性不好说

  摘录几个用到的regex,留个念想

 

(第1个是解析一种类型报文的,后面3个和在一起解析另外一种报文,其它报文类似)

std::string str_recon =			"^(\\d{1})(\\d{8})(\\d{4})([0-9A-F]{4})([\\x20-\\x7a]{2})(\\d{1,15})(\\|)(\\|)(\\|)(\\|)(\\d)(\\d)(\\|)(\\d{1,11})(\\|)(\\d{1,4})(\\|)(\\d{1,11})(\\|)(\\d{1,4})(\\|)([0-9A-F]{8})";

std::string str_et =			"^(\\d{1})(\\d{8})(\\d{4})([0-9A-F]{4})([\\x20-\\x7a]{2})(\\d{1,15})(\\|)([\\x20-\\x7a~]{1,40})(\\|)(\\d{1,11})(\\|)([\\x20-\\x7a~]{0,16})(\\|)(\\d)(\\d)()(\\|)(\\d{0,15})(.*)(\\|)((?:)|[\\x20-\\x7a]{27}|[\\x20-\\x7a]{33})(\\|?)((?:)|[0-9A-F]{16})([0-9A-F]{8})$";

std::string str_et_ic =		"^(\\|?)(\\d{10})(\\|)(\\d{2})(\\|)(\\d{3})(\\|)(\\d{3})(\\|)(\\d{2})(\\|)(.*)$";

std::string str_et_ic_29f =	"^([\\x20-\\x7a]{16})([\\x20-\\x7a]{4})([\\x20-\\x7a]{4})([\\x20-\\x7a]{8})([\\x20-\\x7a]{10})(\\d{2})([\\x20-\\x7a]{1,64})(~?)([\\x20-\\x7a]{0,32})(~?)((?:)|[\\x20-\\x7a]{4})(~?)((?:)|[\\x20-\\x7a]{2})(~?)((?:)|[\\x20-\\x7a]{6})(~?)((?:)|[\\x20-\\x7a]{4})(~?)((?:)|[\\x20-\\x7a]{0,30})$";
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值