最近做一个项目需要修改用户提交文本中的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;
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
}
}
}
}
}
一定要好好学习下正则了,

,去偷学点爬虫的抓取知识(聚类 好高深)
补充下新学到的懒惰匹配,简单易懂
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));
}
}
}
}
分享到:


2009-03-08 19:01
浏览 18651
评论