Object-C下的preg_match_all

熟悉php的都知道preg_match_all是一个超级强大的正则表达式函数。在数据采集的世界里,有了她,几乎是所向披靡,神挡杀神,佛挡杀佛。
话说早些年(好像是去年)还在用黑苹果的时候,用php写好多脚本,那时候还很迷51cto,经常写一些东西就搁上面,也经常有人加好友,留言,讨论一些问题。为了加强互动的及时性,专门写了个脚本用来登陆51cto查询消息并通过growl提示的:growl+php构建桌面消息系统
话说头两年的时候真的很迷php,用php写了很多脚本完成一些日常工作,以至于现在回想起来似乎那时候所有服务器维护的脚本都走php了(基本就是php+system)。话说那时候写php写的真顺手;话说。。。还是不说了扯的有点儿远,还是说preg_match_all吧。在growl+php构建桌面消息系统一文里是否登陆成功,是否有新消息等功能都是通过正则表达式来匹配的。那时候登陆设置cookie还是挺费劲的事儿,我实现的方法也很urgy:先用firefox登陆,然后再用系统命令sqlite去查firefox的数据库,然后。。。。。ok,打住,为嘛感觉老是回不到正题呢,还是直接说吧,昨天突然想到了这个脚本(好久没用了,用了白苹果以后就没再配那个环境),于决定用Object-C再实现一遍,到正则判断这块突然想Object-C有没有类似preg_match_all的函数,很遗憾没有。Object-C里有个NSPredicate,虽然能过SELF MATCHES可以通过正则匹配一些数据,但是也只限把数据挑出来,不像preg_match_all实现类似:

<span>(.*)<font class=\"cRed fB\">(.*)</font>

通过“()”把想要的数据提取出来。不甘心继续找,终于RegexKit进入了我的视线。ok,下面进入传说中的正题。
RegexKit是第三方实现的开源的正则表达式库,功能很强大。官方地址是:regexkit.sourceforge.net。有句话咋说来着,弱水三千只取一杯。RegexKit太强大,而且已经编译成了framework,我下载了个最新版,结果安装的时候提示找不到xcode。(当然了,xcode4.2以后,不再安装到/Developer了。)才发现,其实我只需要RegexKitLite就能解决我的需求。下载地址:RegexKitLite
解压以后会得到RegexKitLite.h和RegexKitLite.m两个文件。将两个文件直接拖进工程,只需要添加一个依懒库:libicucore.dylib。大功告成一半!
具体用法,首先引入头文件:

#import "RegexKitLite.h"

然后就是写表达式啦:

//检查消息
/* <img src="images/top_line.jpg" /><font><a href="message.php?type=newmsg" title="有新短消息" target="_blank" class="cooacomeimage">2</font>消息</a>
*/
NSString *msgMatch = @".*有新短消息.*cooacomeimage\">(.*)</font>(.*)</a>";
NSArray *msgResult = [_txtString arrayOfCaptureComponentsMatchedByRegex:msgMatch];
NSLog(@"msgResult:%@",msgResult);

运行结果:

msgResult:(
        (
        "         <img src=\"images/top_line.jpg\" /><font><a href=\"message.php?type=newmsg\" title=\"\U6709\U65b0\U77ed\U6d88\U606f\" target=\"_blank\" class=\"cooacomeimage\">1</font>\U6d88\U606f</a>",
        1,
        "\U6d88\U606f"
    )
)

以上是运行结果了,这里要注意的就是与php里的preg_match_all不同,成功匹配一条会得到至少一条全部的信息,也就是第一条了,因为我正则里加了两个“()”所以另外两条数据也给挑出来了。上面得到的是什么信息呢?看下截图吧:

基本就这么多了,关于preg_match_all就说完了,最后吐槽一下:终于用的不是脚本语言了。我并不说脚本语言不好,对于数据抓取,尤其是需要登陆的,用php设置cookie啥的真是个挺费劲的时候,用了Object-C,用了ASIHttpRequest,只想说两个字:so easy!

转载请注明: 转自Rainbird的个人博客
   本文链接: Object-C下的preg_match_all


相关博文

    分享到:

About rainbird

IOS攻城狮
This entry was posted in Mac开发, object-c, xCode and tagged , , , , , , . Bookmark the permalink.

发表评论