最近都是需求驱动学习,自己要从一张网页内容里抓一些东西,需要通过正则来匹配,顺便把Java正则搜出来看一下,写写完成需求的过程。
文本内容大致为一张网页里,需要抓出
<a href="http://asfasf.safasf.asfasf"><img src="http://asfasf.asfasf.asfas" name="safaskfjl" /></a>
以上文本里的三段引号里的内容,由于不需要考虑性能,自己就用正则了,原以为比较简单,结果遇到一些小问题,查阅了一些资料,顺便就写写正则匹配吧。
匹配符号就不说了,常用的都背下来了,Linux中常用到。Java中有几种不同的匹配方式,贪婪,懒惰和侵占,默认是贪婪匹配。举例:aabbacbaeb
贪婪匹配:a.*b匹配所有
懒惰匹配:a.*?b配以匹配aab,acb,aeb
侵占匹配:a.*+b则所有字符串都被.*优先匹配并吃掉,结果b无法匹配出现匹配为空
于是用懒惰匹配,把需要匹配的内容改成变量,于是很快写出:<a\\shref=\"(.*?)\"><img\\ssrc=\"(.*?)\"\\sname=\"(.*?)\"\\s/></a>
将以上内容匹配一张网页发现匹配有问题,网页上如果只出现单个的链接内容如<a href="http://asffsa.fsafsa.ffsa">asaf</a>于是就2掉了,前置会优先匹配<a href=",然后(.*?)会匹配之间到下一个"><img src="里的所有内容。由于直接拿了网页内容来测试,匹配的内容稀奇古怪,刚开始还没找到原因。于是晚上搜资料,怎么会用错了呢,思路也在考虑href后匹配><img就可以了,但是没有这样的指定方法,后来想到了可能是.*?将太多无用的内容给匹配掉了。于是改写为<a\\shref=\"(http://[A-Za-z0-9\\./]+?)\"><img\\ssrc=\"(.*?)\"\\sname=\"(.*?)\"\\s/></a>,这样就不至于被一些其他链接内容干扰。排查共花了1个多小时,期间看了各种正则的资料。还是挺有收获的。
总结,正则表达式是程序猿必备技能阿,还是需要系统的学习一遍的,建议边干边学。