`

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正则表达式获取url的host示例

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

    所有常用的正则表达式

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

    精通正则表达式~~~

    在真实世界中提取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 ...

    常用正则表达式

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

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

    网页爬虫:就是一个程序...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 空白行的正则表达式...

    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. 不包括特殊字符的匹配 (字符串中不包括符号 数学次方号^ 单引号' 双引号" 分号; 逗号, 帽号: 数学减号- 右尖...

    spark实现财经新闻搜索引擎(正文提取、中文分词、倒排索引构建、执行搜索)

    (1)新闻正文提取,采用正则表达式提取指定网站栏目新闻的标题、正文和发表时间。 评分标准:一个栏目15分(多一个栏目+5分)(25分);使用通用算法提取不固定格式正文(不算很难)40分 (2)中文分词(worldcount...

    蜂巢爬虫系统 .zip

    是一套只需要定义XPath,就可实现爬取网站,APP的系统, 支持多种解析方式(XPath,正则表达式),多种下载方式(HttpClient库, PhantomJs, Selenium),多种输出方式(Excel,MongoDB)。 爬虫(Web Crawler)是一种...

    JsUrl-java的爬虫.zip

    常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用...

    javaURL抓取知乎explore页面上热门问题和回答的爬虫程序.zip

    常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用...

Global site tag (gtag.js) - Google Analytics