`

java正则表达式提取url

    博客分类:
  • JAVA
阅读更多

最近做一个项目需要修改用户提交文本中的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]\\s+(href\\s*=[^>]+\\s*)>)(.*)</[aA]>).*";
  public static   final String patternString2=".*(<\\s*[aA]\\s+(href\\s*=[^>]+\\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="这是测试<a href=http://www.google.cn>www.google.cn</a>真的是测试了";
    
    /**保存提取出来的url,用set从某种程度去重,只是字面上,至于语义那就要需要考虑很多了*/
    Set<String> set=new HashSet<String>();
   
    /**解析url并保存在set里*/
    parseUrl(set,ss);
    
    /**针对解析出来的url做处理*/
    System.out.println(replaceHtml(set,ss));
   
	}  
	
	/**给每个url加上target属性*/
	
	public static String replaceHtml(Set<String> set,String var)
	{
		 String result=null;
		 /**最好不要对参数修改*/
		 result=var;
		 Iterator<String> 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<String> set,String var)
	{
		Matcher matcher=null;
		String result=null;
		
		
		//假设最短的a标签链接为 <a href=http://www.a.cn></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
				}
				
			}
		}
		
	}

}

 一定要好好学习下正则了, ,去偷学点爬虫的抓取知识(聚类 好高深)

 

 

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

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]\\s*(href=[^>]+)>(.*?)</[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="这是测试<a href=http://www.ba*****idu.cn>www.goog[]e.cn</a>真的是测试我试下<A href='http://www.google.cn'>www.google.cn</a>了";
     
	    parseUrl(null,ss);
	}
	
	public static void parseUrl(Set<String> 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));
					}
				 
					
				}
			
			
		
	}

}

 
分享到:
评论

相关推荐

    java正则表达式匹配网页所有网址和链接文字的示例

    主要介绍了java正则表达式匹配网页所有网址和链接文字java正则表达式匹配,需要的朋友可以参考下

    java正则表达式获取url的host示例

    使用httpclient抓取页面信息时需要填写HOST,使用此正则提取抓取URL的HOST内容

    所有常用的正则表达式

    匹配网址URL的正则表达式:[a-zA-z]+://[^s]* 评注:网上流传的版本功能很有限,上面这个基本可以满足需求 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 评注:...

    常用正则表达式

    说明一下,这里我只是一个搬运工,正则表达式是根据android.util.Patterns类的正则表达式提取出来的,对于使用JAVA开发,可以直接使用这个来对一下常用的正则表达式校验.这里主要包含:Web URL的校验,域名的校验,IP地址的...

    精通正则表达式~~~

    在真实世界中提取URL. 206 扩展的例子... 208 保持数据的协调性... 209 解析CSV文件... 213 第6章:打造高效正则表达式.... 221 典型示例... 222 稍加修改——先迈最好使的腿... 223 效率vs准确性... 223 ...

    Java-PHP正则表达式的使用

     匹配网址URL的正则表达式:[a-zA-z]+://[^s]*  评注:网上流传的版本功能很有限,上面这个基本可以满足需求  匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ ...

    正则表达式经典实例

    即使有经验的用户也经常会遇到性能不佳、误报、漏报等让人挠头的错误,本书对于如何使用正则表达式来解决一些常见的问题给出了按部就班的解决方案,其中包括c#、Java、JavaScript、Perl、PHP、Python、Ruby和VB...

    正则表达式经典实例.pdf

    即使有经验的用户也经常会遇到性能不佳、误报、漏报等让人挠头的错误,本书对于如何使用正则表达式来解决一些常见的问题给出了按部就班的解决方案,其中包括c#、Java、JavaScript、Perl、PHP、Python、Ruby和VB...

    正则表达式

    [JAVA] javascript 正则表达式 秋雨叶 发表于 2004-12-9 14:54:13 正则表达式是一个描述字符模式的对象。 JavaScript的RegExp对象和String对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的...

    一个java正则表达式工具类源代码.zip(内含Regexp.java文件)

    * Summary of regular-expression constructs 正则表达式结构简介: * Construct Matches * Characters 字符: * x The character x x 字符 x * \\ The ...

    java 银行卡 验证 正则表达式使用

    验证工具类: 1.银行卡验证 2.手机号码验证 3.邮箱,URL地址验证

    使用正则表达式实现网页爬虫的思路详解

    网页爬虫:就是一个程序...4.建立正则规则,因为这里我们是爬去网页中的邮箱信息,所以建立匹配 邮箱的正则表达式:String regex=”\w+@\w+(\.\w+)+”; 5.将提取到的数据放到集合中。 代码: import java.io.Buffered

    正则表达式教程

    )+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$26 中文字符的正则表达式:[\u4e00-\u9fa5]27 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))28 空白行的正则表达式...

    jemter配置文档

    具体方法,在需要获得数据的请求上右击添加一个后置处理器--&gt;正则表达式提取器引用名称即下一个请求要引用的参数名称,如填写 title,则可用 ${title} 引用它。正则表达式中 () 括起来的部分就是要提取的。. 代表...

    ReadHtml.java

    读取Html文件,利用正则表达式提取html里面所有a标签的url和文本,

    java解析给定url

    * 正则表达式匹配关键数据 * @param line * @return */ private Set&lt;String&gt; parse(String line) { Set resSet = new LinkedHashSet(); Pattern pattern = Pattern.compile(reg); Matcher matcher = pattern...

    Java-PHP-C#

    ereg() and eregi() 有一个特性是允许用户通过正则表达式去提取字符串的一部分(具体用法你可以阅读手册). 比如说,我们想从 path/URL 提取文件名 – 下面的代码就是你需要: ereg("([^\\/]*)$", $pathOrUrl, $regs);...

    java的正规表达式的java工具类

    3 匹配匹配并提取url ; 4 匹配并提取http ; 5.匹配日期 6 匹配电话; 7 匹配身份证 8 匹配邮编代码 9. 不包括特殊字符的匹配 (字符串中不包括符号 数学次方号^ 单引号' 双引号" 分号; 逗号, 帽号: 数学减号- 右尖...

    自己整理的Scrapy爬虫笔记

    Scrapy爬虫笔记是一份详细的爬虫开发笔记,涵盖了Scrapy框架的基础知识、requests库的使用、lxml解析器的应用、正则表达式的匹配等多方面的内容。本笔记将带领读者深入了解Scrapy爬虫的开发过程,掌握爬虫开发的基础...

Global site tag (gtag.js) - Google Analytics