`

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中的正则表达式,并提供丰富的实例来帮助开发者理解和应用这些概念。 1. 正则...

    java正则表达式教程html版带目录

    Java正则表达式是Java编程语言中的一个强大工具,它用于模式匹配和字符串处理,尤其在数据验证、文本检索和替换等方面发挥着重要作用。本教程是专为初学者设计的HTML版,旨在帮助读者快速掌握Java正则表达式的概念和...

    java正则表达式详解(PDF)

    Java正则表达式是Java编程语言中的一个强大工具,用于处理字符串模式匹配和搜索替换操作。它是基于Perl和POSIX正则表达式的实现,提供了一种灵活且强大的方式来处理文本数据。本文件"java正则表达式详解(PDF)"深入...

    正则表达式自动生成器 V2.0.0.1 官方多语版

    正则表达式自动生成器V2.0.0.1是一款强大的工具,旨在帮助用户方便快捷地构建和测试正则表达式。它提供了多语言支持,使得不同地区的用户都能无障碍地使用。在IT领域,正则表达式是进行文本处理、数据验证和搜索替换...

    Java正则表达式快速学习

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它允许程序员通过模式匹配来查找、替换或分割文本。正则表达式在各种场景下都有广泛应用,如数据验证、文本提取、搜索替换等。本篇文章将深入探讨Java中的...

    java正则表达式及例子 pdf

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它允许程序员通过模式匹配来查找、替换或分割文本。正则表达式在各种场景下都有广泛应用,如数据验证、文本提取、搜索替换等。本篇文章将深入探讨Java中的...

    Java正则表达式入门介绍课件

    Java正则表达式是编程语言Java中用于处理字符串的强大工具,它允许程序员通过模式匹配来查找、替换或提取文本。正则表达式在各种场景下都有广泛应用,如数据验证、文本搜索与替换等。本课件旨在为初学者提供一个Java...

    java正则表达式从入门到精通

    Java正则表达式是Java编程语言中的一个强大工具,用于处理字符串匹配、查找、替换等操作。它基于Perl风格的正则表达式,为开发者提供了高效且灵活的文本处理能力。在这个“Java正则表达式从入门到精通”的主题中,...

    Java 正则表达式小结

    Java正则表达式是Java编程语言中的一个强大工具,它用于在字符串中进行模式匹配和查找、替换等操作。在本文中,我们将深入探讨Java正则表达式的概念、语法以及如何在实际编程中使用它们。 1. **正则表达式基础** -...

    java正则表达式资料下载

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它允许程序员通过模式匹配来查找、替换或分割文本。正则表达式在各种场景下都有广泛应用,如数据验证、文本提取、日志分析等。Java中的正则表达式功能主要...

    java_zhengze.rar_正则表达式_正则表达式 java

    本资料"java_zhengze.rar"提供了对Java正则表达式的详细讲解,包括基本概念、元字符、预定义字符类以及各种匹配操作,对于Java开发者来说是一份非常实用的学习资源。 首先,我们来了解一下正则表达式的基石——元...

    java正则表达式,十分有用的正则表达式

    ### Java正则表达式的应用与理解 #### 一、引言 在软件开发过程中,处理字符串是一项非常常见的任务。为了高效地完成字符串的匹配、查找、替换等操作,正则表达式成为了一种不可或缺的工具。Java作为一种广泛使用...

    java 正则表达式 perl5规范 jakarta-oro.jar

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它遵循Perl 5规范,提供了灵活且功能丰富的模式匹配能力。Jakarta ORO(Oracle RegEx)库是Apache软件基金会的一个项目,它是一个高性能的Java正则表达式...

    JAVA正则表达式实例教程.rar

    Java正则表达式是Java编程语言中的一个强大工具,用于处理字符串模式匹配和搜索替换操作。在本实例教程中,我们将深入探讨Java正则表达式的概念、语法以及常见应用。 一、Java正则表达式基础 Java正则表达式基于...

    java正则表达式实例(邮箱,车牌,密码,url,IP,身份证,车牌等等)

    ### Java正则表达式实例详解 #### 一、概述 正则表达式是一种强大的文本处理工具,能够帮助我们在字符串中查找、替换或提取特定模式的数据。在Java编程中,正则表达式的应用非常广泛,例如在表单验证、数据清洗等...

    正则表达式列举 代码 项目中直接使用

    正则表达式是一种强大的文本处理工具,用于模式匹配、搜索、替换等操作,在软件开发、数据处理、网络爬虫等领域有着广泛的应用。在项目中直接使用正则表达式可以极大地提高代码的效率和可读性。以下是对给定文件中的...

    C#和JAVA正则表达式

    Java正则表达式的语法与C#基本一致,但有一些小差异,比如Java中的`\d`等预定义字符类需要写成`\p{Digit}`。 正则表达式的强大在于它的灵活性和表达力。例如,我们可以用`(\\d{3})-(\\d{2})-(\\d{4})`来匹配美国...

    java正则表达式详解java正则表达式详解

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它允许程序员通过模式匹配来查找、替换或分割文本。正则表达式(Regular Expression,简称regex)是一种由字符、元字符和操作符组成的模式,可以用来匹配...

    正则表达式 正则表达式 正则表达式

    - 在JavaScript、Python、Java、C#等编程语言中,正则表达式都有内置的支持,提供了构造、匹配、替换、查找等功能。 8. **实例应用**: - 验证邮箱地址:`/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/` ...

Global site tag (gtag.js) - Google Analytics