初学正则表达式之不可忽视的空白符

前几天的博文关于一道.NET程序员面试题的遐想》得到了很多高手的指教,使我学到了很多,在这里再次向园子里的高手们表示感谢。

开篇,还是从一道面试题开始谈起:

面试题:抓取招聘信息。

如下图:

 

 

 这是从智联招聘网站上截取的一份招聘信息页面,要求用正则表达式抓取出当前页面下的所有职位名称。

想必,接触过正则表达式的程序员做出这道题来都不算困难。只要根据页面的一些规律性的代码就可以写出相应的正则表达式。

 下面附上html代码页面(部分截图):(图2)

 

 解题思路:

要想从页面中匹配出相应的正则表达式,就要找出一定的规律来,如下图:

 

 可见,职位信息都是包含在一个<a></a>超链接中,虽然超链接地址不同但他们的class="jobLink"属性都是相同的,这样,规律就出来了,只要我把其中的 class="jobLink"匹配上,再从中提取组,那么这个职位信息也就提取出来了。

我的提取职位信息的正则表达式如下:

 

 <a href=(.+?)class=\"jobLink\">(.+?)</a>

 

 测试如下图:

 

 

做到这里,又突然勾起了我的兴趣。既然职位信息这么好抓取,那我何不把公司信息及其他的信息都给抓取下了呢?或者说,何不把职位信息和公司信息一一对应的给他抓取下来?毕竟是刚开始学正则表达式,就当练习了,多多练习才能总结出经验和规律来嘛!

再次观察html代码:

可见,对应于职位信息的class="companyLink"这个属性都是一致的。根据这一点,正则表达式也就好写了: 

 

<a href=(.+?)class=\"companyLink\">(.+?)</a>

 

测试如下图:

 

 

 接下来就是怎么将这两个正则表达式给合并了:

再次观察图2,再这两个<a></a>之间只是隔了一些<td></td>表格标签,所以开始我想到的方法就是用 .+? 来进行匹配即可。但是无论我怎么测试,都出不来想要的效果。

以下是我测试时失败的正则表达式:

1. <a href=(.+?)class=\"jobLink\">(.+?)</a>(.+?)<a href=(.+?)class=\"companyLink\">(.+?)</a>

2. <a href=(.+?)class=\"jobLink\">(.+?)</a></td>(.+?)<td id=\"dvCompNM\"><a href=(.+?)class=\"companyLink\">(.+?)</a>

3. <a href=(.+?)class=\"jobLink\">(.+?)</a></td><td></td><td id=\"dvCompNM\"><a href=(.+?)class=\"companyLink\">(.+?)</a>

第三种方法我干脆直接都把这些<td>标签给写上了,但仍出不来想要实现的效果。

最后只得向敬爱的晓虎哥求助了。

晓虎哥说:在<a>标签和<td>标签之间的这些空白符(如图2)也算是字符串,必须把他们也要匹配出来。

虎哥的一句话让我顿悟啊,之前我一直觉得这些只是空白吗,根本不显示的,又不像换行符虽不显示出来但查看源码还有个<br>标签呢,但是空白符也是占着一定的位置的。

所以,修改后的正则表达式为:

 <a href=(.+?)class=\"jobLink\">(.+?)</a></td>\s*?<td></td>\s*?<td id=\"dvCompNM\"><a href=(.+?)class=\"companyLink\">(.+?)</a>

 

 下图是我自己写的程序的抓取结果截图:

 

 总结一下吧:

有些细微的地方很容易被忽略掉,但关键时刻也是这些最容易被忽视的地方决定着整件事情是成功还是失败。毕竟细节决定成败嘛!

空白符,我记住你了。

后天晓虎哥就要去往别的城市工作了,这段时间里非常感谢他教会我的解题方法和技巧,在这里祝他一路顺风吧!

初学正则表达式,希望可以帮到一些朋友们!

再向大家推荐一个学习正则表达式的网站,http://deerchao.net/tutorials/regex/regex.htm

同时也欢迎大家多多指教!

 

posted @ 2012-02-28 02:31  酷小孩  阅读(9249)  评论(10编辑  收藏  举报