java正则表达式提取href_java正则表达式提取url

最近做一个项目需要修改用户提交文本中的url。其实不管是这个应用还是其他的应用,都有需要用到正则表达式的地方,因为程序里的数据大部分都是字符类型,最终用户看到的也都是字符类型(不是简单的理解为String,你一个110你也未必知道是int类型,从网络过来的还都是字符),所以这个世界的数据都是表格式的(LISP)表格中都是字符类型的。ok不乱扯了这只是我的理解。

先来看代码好了。

import java.util.HashSet;

import java.util.Iterator;

import java.util.Set;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

/**

*

* @author dikar

* 比较简陋的提取url

* 真的很丑陋,都怪自己正则没学好,正则里多次匹配忘了怎么写了,要不很好搞定,哎

* 提取完的url保存在SET里

* 可以针对这个做新的处理

* 大家可以看下好的爬虫是如何提取url的,待有时间分析下

*

*/

public class TestString {

/**多次使用的话不需要重新编译正则表达式了,对于频繁调用能提高效率*/

public static final String patternString1="[^\\s]*((]+\\s*)>)(.*)[aA]>).*";

public static final String patternString2=".*(]+\\s*)>(.*)[aA]>).*";

public static final String patternString3=".*href\\s*=\\s*(\"|'|)http://.*";

public static Pattern pattern1 =Pattern.compile(patternString1,Pattern.DOTALL);

public static Pattern pattern2 =Pattern.compile(patternString2,Pattern.DOTALL);

public static Pattern pattern3 =Pattern.compile(patternString3,Pattern.DOTALL);

/**

* @param args

*/

public static void main(String[] args) {

/**测试的数据*/

String ss="这是测试www.google.cn真的是测试了";

/**保存提取出来的url,用set从某种程度去重,只是字面上,至于语义那就要需要考虑很多了*/

Set set=new HashSet();

/**解析url并保存在set里*/

parseUrl(set,ss);

/**针对解析出来的url做处理*/

System.out.println(replaceHtml(set,ss));

}

/**给每个url加上target属性*/

public static String replaceHtml(Set set,String var)

{

String result=null;

/**最好不要对参数修改*/

result=var;

Iterator ite=set.iterator();

while(ite.hasNext())

{

String url=ite.next();

if(url!=null)

{

result=result.replaceAll(url,url+" target=\"_blank\"");

}

}

return result;

}

public static void parseUrl(Set set,String var)

{

Matcher matcher=null;

String result=null;

//假设最短的a标签链接为 则计算他的长度为28

if(var!=null && var.length()>28)

{

matcher=pattern3.matcher(var);

//确定句子里包含有链接

if(matcher!=null && matcher.matches())

{

matcher=pattern1.matcher(var);

String aString=null;

String bString=null;

while(matcher!=null && matcher.find())

{

if(matcher.groupCount()>3)

{

bString=matcher.group(matcher.groupCount()-3);//这个group包含所有符合正则的字符串

aString=matcher.group(matcher.groupCount()-2);//这个group包含url的html标签

String url1=matcher.group(matcher.groupCount()-1);//最后一个group就是url

set.add(url1);//将找到的url保存起来

bString=bString.replaceAll(aString, "");//去掉已经找到的url的html标签

}

}

if(bString!=null)

{

parseUrl(set,bString);//继续循环提取下一个url

}

}

}

}

}

一定要好好学习下正则了,

0956f0a970daab536ce4be0ee96b00ac.gif

,去偷学点爬虫的抓取知识(聚类 好高深)

补充下新学到的懒惰匹配,简单易懂

import java.util.HashSet;

import java.util.Iterator;

import java.util.Set;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class TestReg {

/**多次使用的使用不需要重新编译正则表达式了,对于频繁调用能提高效率

*

*

* */

public static final String patternString1="]+)>(.*?)[aA]>";

public static Pattern pattern1 =Pattern.compile(patternString1,Pattern.DOTALL);

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

/**测试的数据*/

String ss="这是测试www.goog[]e.cn真的是测试我试下www.google.cn了";

parseUrl(null,ss);

}

public static void parseUrl(Set set,String var)

{

Matcher matcher=null;

String result=null;

matcher=pattern1.matcher(var);

while(matcher!=null && matcher.find())

{

int a=matcher.groupCount();

while((a--)>0)

{

System.out.println(matcher.group(a));

}

}

}

}

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2009-03-08 19:01

浏览 18651

评论


版权声明:本文为weixin_39542850原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。