正@则表达式
#include#include#includeintmain(){char*p="hello\"world";printf("\"%s\n",p);charq[15]={0};charr[15]={0};sscanf(p,"%[^\"]%*c%s",r,q);printf("%s\n",r);printf("%s\n",q);return0;}http://www.cnblogs.com/youthlion/archive/2009/06/21/1507586.html出处:http://blog.csdn.net/phil2036/archive/2009/05/27/4221704.aspx
感谢原文作者分享。
在看这篇文章之前建议你先了解一下什么是正则表达式,具体不重复了,google一下能出一大堆,不过这篇文章比较好,贴个urlhttp://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm,作者说30分钟能看完的不是地球人,但是我15分钟就看完了还记住了90%以上,好吧我来自火星,玩笑到此结束,下面切入正题。
本文的命题源自于这样的一个url,protocol://ip:port/chn/mode,比如说,dv://192.168.1.253:65001/1/1。如果我要解析出来各个部分,并把它们保存到各自的变量里面要怎么做?传统的C程序员会说用strtok慢慢取得各个部分,对于要转成int的用atoi,部分C++程序员也许会放弃strtok转用std::string当中的find系列成员函数(find/find_first_of...)。是的,我以前也是这么干的,两种方法都用过,当然也包括MFC里的CString的相关成员函数。现在,一种全新的方法源自于sscanf这个C语言函数。
无论你用C还是C++,sscanf和scanf这两个函数都不会太陌生,%d%s%f甚至%02d%.2f这些东西你也很熟,看了上面我说的正则表达式,也许你会写出这么一个正则表达式:[a-zA-Z]+://(\d{1,3}\.){3}(\d{1,3}):\d{1,5}/\d{1,}/\d,没错,这个正则表达式的IP部分有点问题,但是为了描述简单,暂时就这么用了。激动人心的时候到了,我要告诉你的是scanf以及sscanf实际上是支持部分正则表达式的,当然即使是到现在我依旧不敢肯定这个部分是否是ANSI的一部分,但是我的VS2005上没有问题,朋友的VS2003上也没有问题,至于VC6实在太古老暂时找不到测试。但是顺便说一句,VS2005上你用sscanf或者scanf他会出警告的,他说这两个函数不安全建议你用sscanf_s和scanf_s,我试了下推荐的两个函数又不支持这个功能了,比较