博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初学正则表达式之不可忽视的空白符
阅读量:6948 次
发布时间:2019-06-27

本文共 1678 字,大约阅读时间需要 5 分钟。

前几天的博文关于一道.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://buenl.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
Ansible快速开始-指挥集群
查看>>
Java容器详解(以Array Arrays ArrayList为例)
查看>>
Iterator和ListIterator迭代器
查看>>
思科默认 NAT timeout
查看>>
error 1067 (42000) at line 1:Invalid default value for 'id'
查看>>
我的友情链接
查看>>
逻辑DG ORA-16240: Waiting for logfile
查看>>
ORACLE系列脚本3:救命的JOB处理脚本
查看>>
STP
查看>>
yii 一些引用路径的方法
查看>>
vue图片上传相关(持续更新)
查看>>
java内存简单总结
查看>>
实现windows server 2008 R2多用户同时登陆或者同一用户名同时登陆
查看>>
PMD 插件的安装和使用
查看>>
利用JavaScript生成二维码并且中间有logo
查看>>
泛型小例子
查看>>
译文:C#中的弱事件(Weak Events in C#)
查看>>
抽象工厂模式
查看>>
Maven
查看>>