先放出测试代码,然后再对几个关键点进行简单解释
packagetest; importjava.util.regex.Matcher; importjava.util.regex.Pattern; publicclassTest1{ publicstaticvoidmain(String[]args){ Stringstr1="<ahref=\"http://www.zifangsky.cn/2015/10/hello-world/\"title=\"\"data-original-title=\"HelloWorld\">HelloWorld</a>"; Stringstr2="<ahref=\"http://banzhuanboy.com/363.html\"class=\"post-feature\"\">123</a>"; Stringstr3="<aclass=\"article-title\"href=\"/2015/12/17/Webstorm-Hotkeys-For-Mac/\">c</a>"; Stringstr4="<arel=\"bookmark\"title=\"PermanentLinkto黑客组织‘SkidNP’涂改了PhantomSquad的网站首页\"href='12/hack-30127.htm'>黑</a>"; Stringstr5="<ahref=\"http://www.imorlin.com/2015/12/24/1-3/\"title=\"\"data-original-title=\"2015圣诞节雪花代码[天猫+C店]\">2015圣诞节雪花代码[天猫+C店]<spanclass=\"labellabel-newentry-tag\">New</span></a>"; Patternpattern=Pattern.compile("<a.*?href=[\"']?((https?://)?/?[^\"']+)[\"']?.*?>(.+)</a>"); Matchermatcher=pattern.matcher(str1); if(matcher.find()){ Stringlink=matcher.group(1).trim(); Stringtitle=matcher.group(3).trim(); if(!link.startsWith("http")){ if(link.startsWith("/")) link="http://www.zifangsky.cn"+link; else link="http://www.zifangsky.cn"+link; } System.out.println("link:"+link); System.out.println("title:"+title); } } }
解释:
1 选取了几个有代表性的a标签样式进行测试
2 关于正则匹配模式”<a.*?href=[\”‘]?((https?://)?/?[^\”‘]+)[\”‘]?.*?>(.+)</a>“的说明:
i)<a.*?href= <a开头,中间紧跟着有0个或者多个字符,然后再跟着href=
ii)[\”‘]?((https?://)?/? 一个或者0个的” 或者 ‘ ,然后再跟着0个或者一个的http://或者https:// ,再跟着0个或者1个的 /
iii)[^\”‘]+ 表示1个以上的不包括’或者” 的任意字符
iv)[\”‘]?表示链接后面的’或者” 当然也可能没有
后面的可以根据前面的自己推理,就不解释了
3 matcher.group(1)表示取出链接,也就是第二个()的内容(PS:第一个()表示的是整个正则表达式,默认省略了),在正则中是这一段规则:((https?://)?/?[^\”‘]+)
4matcher.group(3) 同理可知,对应的是这一段规则:(.+)
5 对于代码中的http://www.zifangsky.cn ,这是由于部分链接使用了相对路径,比如说:href=’12/hack-30127.htm’ 。这时我们就需要加上它的域名,当然需要根据实际情况来加。这里我就随便乱加了 wordpress/plugins/emoticons/images/13.gif">