`
沙漠绿树
  • 浏览: 429552 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

正则表达式--捕获最前和最后的组及网页日期时间的抓取

阅读更多
引用
    做信息采集时,难免要用到一些正则表达式了。但是用正则表达式有个贪婪性问题。

    贪婪量词先看整个字符串是不是匹配,如果没有发现匹配,先去掉最后字符串中的最后一个字符,并再次尝试,如果还没有发现匹配,那么再次去掉最后一个字符,这个过程会一直重复下去直到发现匹配或不剩任何字符串,上面的简单量词都是贪婪量词。
  惰性量词先看字符串中的第一个字母是不是一个匹配,如果不匹配则继续读入下一个字符进行匹配,如果没有则一直匹配下去,与贪婪量词刚好相反,惰性量词用上面的简单量词跟一个?表示。
  支配量词只尝试匹配整个字符串,如果整个字符串不能匹配,不能进一步尝试。

    运用前瞻可以告诉正则表达式运算器向前看一些字符而不移动其位置,包括正向前瞻和负向前瞻,正向前瞻检查的是接下来出现的是不是某个特定字符集,而负向 前瞻则是检查接下来的不应该出现的特定字符集。创建正向前瞻要将模式放在(?=和)之间。创建负向前瞻要将模式放在(?!和)之间。

    下面我做了个例子来解决下这个问题。主要是用 贪婪限定符 ‘?’。


package slcx.com.example;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 
 * 这里是用来检测正则表达式的贪婪性。
 * 
 * @author LoongHua
 *
 */

public class T {

	
	public static void getDefaulst(){
	
		//这里得到默认的那个'XX'及其下一个字符的正则表达式
		String regex = ".*(XX.).*";
		
		String s="..aaXXbbXXccXXddXXee..";
		
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(s);
		if (matcher.matches()) {
			System.out.println("默认情况下的结果:"+matcher.group(1));
		}
	}
	
	public static void getFirst(){
		
		//我们这里得到第一个'XX'及其下一个字符的正则表达式
		String regex = ".*?(XX.).*";

		String s="..aaXXbbXXccXXddXXee..";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(s);
		if (matcher.matches()) {
			System.out.println("得到第一个的结果:"+matcher.group(1));
		}
		
	}

	public static void getLast(){
		String regex = ".*(XX.).*?";
		
		String s="..aaXXbbXXccXXddXXee..";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(s);
		if (matcher.matches()) {
			System.out.println("得到最后一个的结果:"+matcher.group(1));
		}
	}

	/**
	 * 得到网页中的时间问题
	 */
	public static void getDateTime(){
		String html="更新时间:2009-3-23 13:14:31 作    者更新时间:2009-3-23 13:12:54 作    者更新时间:2009-3-16 17:39:54作    者更新时间:2009-3-13 9:07:22作    者更新时间:2009-3-9 13:41:51作    者更新时间:2009-3-5 11:19:36作    者更新时间:2009-3-5 11:16:33作    者更新时间:2009-3-2 11:56:21作    者更新时间:2009-2-26 10:30:19作    者更新时间:2009-2-26 10:28:49更新时间";
		
		// 这个正则表达式能抓取很多类型的日期时间,小到只有日期,大到日期时间(包括秒),这里是默认情况下提取。
		//String regex=".*[^\\d]((\\d{4}|\\d{2}) ?[/年-] ?\\d{1,2} ?[/月-] ?\\d{1,2} ?[日 ]?( ?\\d{1,2}( ?[点:] ?\\d{1,2}( ?[分:] ?\\d{1,2} ?秒?)?)?)?)[^\\d].*";
		
		//这里使用了贪婪限定符 ? 提取第一个时间
		String regex=".*?[^\\d]((\\d{4}|\\d{2}) ?[/年-] ?\\d{1,2} ?[/月-] ?\\d{1,2} ?[日 ]?( ?\\d{1,2}( ?[点:] ?\\d{1,2}( ?[分:] ?\\d{1,2} ?秒?)?)?)?)[^\\d].*";
		
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(html);
		if (matcher.matches()) {
			System.out.println("得到第一个的时间是:"+matcher.group(1));
		}
		
		//这里使用了贪婪限定符 ? 提取最后一个时间
		regex=".*[^\\d]((\\d{4}|\\d{2}) ?[/年-] ?\\d{1,2} ?[/月-] ?\\d{1,2} ?[日 ]?( ?\\d{1,2}( ?[点:] ?\\d{1,2}( ?[分:] ?\\d{1,2} ?秒?)?)?)?)[^\\d].*?";		
		pattern = Pattern.compile(regex);
		matcher = pattern.matcher(html);
		if (matcher.matches()) {
			System.out.println("得到最后一个的时间是:"+matcher.group(1));
		}
	}
	
	/**
	 * 当网页中有多个日期时间时,我们又不要开始结尾的日期时间时
	 * 
	 * 这个时候我们时候就不能完全用正则来实现了(可能可以,只是我不知道而已)
	 * 
	 * @param index 指定要第几个日期时间。
	 */
	public static void getDateTime(int index){
		String regex="((\\d{4}|\\d{2}) ?[/年-] ?\\d{1,2} ?[/月-] ?\\d{1,2} ?[日 ]?( ?\\d{1,2}( ?[点:] ?\\d{1,2}( ?[分:] ?\\d{1,2} ?秒?)?)?)?)[^\\d].*";
		String html="更新时间:2009-3-23 13:14:31 作    者更新时间:2009-3-23 13:12:54 作    者更新时间:2009-3-16 17:39:54作    者更新时间:2009-3-13 9:07:22作    者更新时间:2009-3-9 13:41:51作    者更新时间:2009-3-5 11:19:36作    者更新时间:2009-3-5 11:16:33作    者更新时间:2009-3-2 11:56:21作    者更新时间:2009-2-26 10:30:19作    者更新时间:2009-2-26 10:28:49更新时间";
		Pattern pattern = Pattern.compile(regex);
		
		int count=0;
		while(html.length()>0){
			Matcher matcher = pattern.matcher(html);
			if (matcher.matches()) {
				count++;
				if(count==index){
					System.out.println("得到第 "+index+" 个的时间是:"+matcher.group(1));
				}
				else{
					html=html.substring(matcher.group(1).length());
				}
			}
			else{
				html=html.substring(1);
			}
		}
	}
	
	public static void main(String[] args) {
		getDefaulst();
		getFirst();
		getLast();
		getDateTime(2);
	}
}

//运行结果是:

默认情况下的结果:XXe
得到第一个的结果:XXb
得到最后一个的结果:XXe
得到第一个的时间是:2009-3-23 13:14:31 
得到最后一个的时间是:2009-2-26 10:28:49
得到第 2 个的时间是:2009-3-23 13:12:54 

0
0
分享到:
评论

相关推荐

    正则表达式-文档和网页

    - **爬虫与数据提取**: 在网络爬虫中,正则表达式是抓取网页数据的重要工具,例如,使用 `\d+` 提取网页上的价格信息。 - **表单验证**: 在前端开发中,正则表达式用于验证用户输入,如邮箱格式验证:`/^\w+@[a-zA...

    精通正则表达式(第三版)简体中文版

    #### 一、正则表达式的定义及用途 正则表达式(Regular Expression)是一种强大的文本处理工具,能够帮助用户查找、替换以及操作特定的字符串或字符组合。它在多种编程语言和操作系统中都有广泛的应用。本书《精通...

    正则表达式学习资料以及练习项目代码很多

    - **网页抓取**:在网页源码中使用正则表达式查找特定信息,辅助网络爬虫工作。 - **文本替换**:使用`re.sub()`可以批量替换字符串中的特定模式,实现格式化和转换。 6. **进阶话题** - **正则表达式性能优化**...

    正则表达式翻译工具,RegexTest.exe

    RegexTest.exe 是一个专门用于测试和解析正则表达式的应用程序,它可以帮助用户理解和调试他们的正则表达式模式,从而更有效地进行文本操作。 在IT行业中,正则表达式是程序员、数据分析师、网络管理员等专业人士...

    精通正则表达式中文版英文版_中文版为扫描版

    正则表达式不仅用于简单的查找和替换,还能在数据验证(如电子邮件地址或电话号码格式检查)、文本分析、网页抓取等场景中发挥巨大作用。通过学习《精通正则表达式》,读者将能够编写更高效、更精确的正则表达式,...

    正则表达式测试工具

    4. **子匹配与组**:允许用户查看并提取正则表达式中的捕获组(capturing groups),这对于处理复杂结构的文本尤其有用。 5. **替换功能**:如果需要,用户可以使用正则表达式进行文本替换操作,根据匹配规则转换...

    正则表达式趣味例子集合

    正则表达式是一种强大的文本处理工具,用于匹配、查找、替换和分析字符串模式。它以简洁的方式描述复杂的字符串规律,广泛应用于编程语言、文本编辑器和各种数据分析工具中。在这个"正则表达式趣味例子集合"中,我们...

    正则表达式之道.rar

    《正则表达式之道》是一本深入探讨正则表达式的资源集合,旨在帮助读者掌握这一强大的文本处理工具。正则表达式(Regular Expression)是一种模式匹配语言,它用于在字符串中进行查找、替换和提取特定模式的操作。在...

    正则表达式.rar

    本资料压缩包包含了一系列关于Java正则表达式的视频教程,旨在帮助用户深入理解和熟练运用这一技术。 1. **正则表达式简介** - 正则表达式(Regular Expression)是由特殊字符和普通字符组成的模式,用于描述一...

    正则表达式工具

    - **网页抓取**: 通过正则表达式提取网页中的特定信息。 - **数据清洗**: 在大量文本数据中筛选出特定格式的数据。 - **输入验证**: 在前端表单中验证用户输入是否符合特定规则。 - **日志分析**: 在系统日志中...

    正则表达式测试器

    通过这样的测试工具,用户不仅可以验证正则表达式的正确性,还可以学习和提升自己的正则表达式技能,使其在数据处理、文本分析、网页抓取等场景下更加得心应手。无论是专业开发者还是普通用户,掌握正则表达式都是...

    获取网页表格数据 正则表达式

    如果需要从网页中抓取这些表格数据,一种常见的方法是使用正则表达式(Regular Expression),结合编程语言如Python的BeautifulSoup或JavaScript的DOM解析。本文将详细探讨如何利用正则表达式来提取`<tr>`和`<td>`...

    正则表达试编辑器,编写正则表达式

    掌握正则表达式不仅能够提高文本处理的效率,还能在许多领域发挥重要作用,比如网页抓取、数据清洗、文本分析等。使用正则表达式编辑器,可以更轻松地学习和应用这些概念,提升工作效率。在RegexTester这样的工具中...

    方便学习查询的正则表达式小词典

    正则表达式是一种强大的文本处理工具,用于匹配、查找、替换和分析字符串模式。它在编程、数据分析、网页抓取等多个领域中都有广泛的应用。"正则表达式小词典"是一个为了帮助学习者理解和查询正则表达式而设计的小型...

    mtracer2.0正则表达式验证工具

    正则表达式广泛应用于数据验证、文本分析、网页抓取等多个场景。mtracer2.0是一款针对正则表达式的验证工具,它为开发者提供了一个直观且便捷的环境来测试和调试他们的正则模式。 1. **mtracer2.0特性** - **无需...

    正则表达式系统教程——学习正则的最简单的教程

    它是编程语言中不可或缺的一部分,特别是在数据处理、文本分析和网页抓取等场景下。本教程“正则表达式系统教程”旨在为初学者提供一个简单易懂的学习路径。 在正则表达式中,我们使用特殊字符(元字符)和构造来...

    正则表达式

    - **爬虫与数据分析**:在网页抓取和数据提取中,正则表达式帮助定位和提取目标信息。 9. **学习资源**: - 《正则表达式入门经典》:这是一本关于正则表达式的书籍,由瓦特撰写,提供了深入浅出的讲解和实例,...

    正则表达式工具 Match Tracer

    Match Tracer是一款专为正则表达式设计的可视化编写及调试工具,它可以帮助用户更加直观地理解和构建复杂的正则模式,提高开发效率。 在编程和数据处理中,正则表达式扮演着至关重要的角色。它们可以用来验证输入...

    VB用正则表达式提取网页中的链接

    在Web页面中,链接通常以`<a href="...">`的形式存在,通过正则表达式的匹配功能,可以精确识别并捕获这些链接地址,从而实现对网页内容的深度解析和数据提取。 ### 描述解读:“VB用正则表达式提取网页中的链接” ...

Global site tag (gtag.js) - Google Analytics