- 浏览: 429552 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
xiesbao:
找到了,太坑爹了。
Intellij Idea 滚动条跳动的问题 -
hvang1988:
按照你说的例子,主备说的是dbtest1,dbtest2,db ...
阿里开源Mysql分布式中间件:Cobar -
hvang1988:
问个问题:一个数据库的表的全部数据只分布在一个cobar上。多 ...
阿里开源Mysql分布式中间件:Cobar -
SiKing:
多谢,一直被这个问题困扰
Intellij Idea 滚动条跳动的问题 -
guodage003:
多谢 解决了这个蛋疼的问题。。
Intellij Idea 滚动条跳动的问题
引用
做信息采集时,难免要用到一些正则表达式了。但是用正则表达式有个贪婪性问题。
贪婪量词先看整个字符串是不是匹配,如果没有发现匹配,先去掉最后字符串中的最后一个字符,并再次尝试,如果还没有发现匹配,那么再次去掉最后一个字符,这个过程会一直重复下去直到发现匹配或不剩任何字符串,上面的简单量词都是贪婪量词。
惰性量词先看字符串中的第一个字母是不是一个匹配,如果不匹配则继续读入下一个字符进行匹配,如果没有则一直匹配下去,与贪婪量词刚好相反,惰性量词用上面的简单量词跟一个?表示。
支配量词只尝试匹配整个字符串,如果整个字符串不能匹配,不能进一步尝试。
运用前瞻可以告诉正则表达式运算器向前看一些字符而不移动其位置,包括正向前瞻和负向前瞻,正向前瞻检查的是接下来出现的是不是某个特定字符集,而负向 前瞻则是检查接下来的不应该出现的特定字符集。创建正向前瞻要将模式放在(?=和)之间。创建负向前瞻要将模式放在(?!和)之间。
下面我做了个例子来解决下这个问题。主要是用 贪婪限定符 ‘?’。
贪婪量词先看整个字符串是不是匹配,如果没有发现匹配,先去掉最后字符串中的最后一个字符,并再次尝试,如果还没有发现匹配,那么再次去掉最后一个字符,这个过程会一直重复下去直到发现匹配或不剩任何字符串,上面的简单量词都是贪婪量词。
惰性量词先看字符串中的第一个字母是不是一个匹配,如果不匹配则继续读入下一个字符进行匹配,如果没有则一直匹配下去,与贪婪量词刚好相反,惰性量词用上面的简单量词跟一个?表示。
支配量词只尝试匹配整个字符串,如果整个字符串不能匹配,不能进一步尝试。
运用前瞻可以告诉正则表达式运算器向前看一些字符而不移动其位置,包括正向前瞻和负向前瞻,正向前瞻检查的是接下来出现的是不是某个特定字符集,而负向 前瞻则是检查接下来的不应该出现的特定字符集。创建正向前瞻要将模式放在(?=和)之间。创建负向前瞻要将模式放在(?!和)之间。
下面我做了个例子来解决下这个问题。主要是用 贪婪限定符 ‘?’。
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
发表评论
-
深入理解Java内存模型
2014-11-08 16:54 1025深入理解Java内存模型(一)——基础深入理 ... -
阿里开源Mysql分布式中间件:Cobar
2014-08-12 11:54 64462这几天研究 ... -
今日开源介绍:Google Guava、Google Guice、Joda-Time
2014-08-11 11:55 18254一、Guava 是一个 Google 的基于java1.6的 ... -
Jackson 动态过滤属性
2014-06-20 16:15 3040在把java对象转换为json时,有时需要依据需求动态过滤掉 ... -
自实现CAS原理JAVA版,模拟下单库存扣减
2014-04-02 17:47 7075在做电商系统时,库存 ... -
JAVA逻辑判断工具类
2013-09-06 21:33 1762在开发过程中,经常需要对“对象”、Map、Collecti ... -
Servlet2.4 监听器
2011-06-17 17:48 1590Servlet API提供了基本的应用程序事件监听器接口。编程 ... -
JSP页面编译成Servlet类文件过程中所涉及到的编码问题
2011-02-23 12:16 2907当请求一个JSP页面时,一般的都需要经历下面几个阶段: 1 ... -
Java中的字符集编码入门(六)Java中的增补字符
2011-02-23 12:11 1481Java号称对Unicode提 ... -
Java中的字符集编码入门(五)Java代码中的字符编码转换
2011-02-23 12:08 1159如果你是JVM的设计者,让你来决定JVM中所有字符的表 ... -
Java中的字符集编码入门(四)网页文件的编码
2011-02-23 12:03 1101接着上节的思路说,一个网页要想在浏览器中能够正确显示,需要在三 ... -
Java中的字符集编码入门(三)GB2312,GBK与中文网页
2011-02-23 12:02 1260GB2312是对中国的开发人员来说很重要的一个词汇,它的来龙去 ... -
Java中的字符集编码入门(二)编码字符集与字符集编码的区别
2011-02-23 12:01 933需要再一次强调的是, ... -
Java中的字符集编码入门(一)Unicode与UCS的历史恩怨
2011-02-23 11:59 1061ASCII及相关标准 ... -
方便管理工程中的SQL语句
2010-10-13 17:13 1849引用 之前在项目开发时候,经理要求把所有的SQL语句挑出 ... -
常见通信名称缩写解释
2010-09-03 16:05 2350引用 在看新闻时,购买手机时,经常听到关于通信方面的一 ... -
飞信维脉系统(定时短息发送系统)
2010-08-01 21:27 1601引用 因为工作原因 ... -
HTTP协议介绍
2010-07-28 09:45 825引用 HTTP(HyperTextTransferPro ... -
Java调用存储过程举例
2010-07-23 18:22 918Java调用oracle存储过程的示例总结如下。 ... -
Oracle数据库链接池
2010-04-13 17:28 2015引用 很多时候我们都要操作数据库,高效数据库操作的第一步 ...
相关推荐
- **爬虫与数据提取**: 在网络爬虫中,正则表达式是抓取网页数据的重要工具,例如,使用 `\d+` 提取网页上的价格信息。 - **表单验证**: 在前端开发中,正则表达式用于验证用户输入,如邮箱格式验证:`/^\w+@[a-zA...
#### 一、正则表达式的定义及用途 正则表达式(Regular Expression)是一种强大的文本处理工具,能够帮助用户查找、替换以及操作特定的字符串或字符组合。它在多种编程语言和操作系统中都有广泛的应用。本书《精通...
- **网页抓取**:在网页源码中使用正则表达式查找特定信息,辅助网络爬虫工作。 - **文本替换**:使用`re.sub()`可以批量替换字符串中的特定模式,实现格式化和转换。 6. **进阶话题** - **正则表达式性能优化**...
RegexTest.exe 是一个专门用于测试和解析正则表达式的应用程序,它可以帮助用户理解和调试他们的正则表达式模式,从而更有效地进行文本操作。 在IT行业中,正则表达式是程序员、数据分析师、网络管理员等专业人士...
正则表达式不仅用于简单的查找和替换,还能在数据验证(如电子邮件地址或电话号码格式检查)、文本分析、网页抓取等场景中发挥巨大作用。通过学习《精通正则表达式》,读者将能够编写更高效、更精确的正则表达式,...
4. **子匹配与组**:允许用户查看并提取正则表达式中的捕获组(capturing groups),这对于处理复杂结构的文本尤其有用。 5. **替换功能**:如果需要,用户可以使用正则表达式进行文本替换操作,根据匹配规则转换...
正则表达式是一种强大的文本处理工具,用于匹配、查找、替换和分析字符串模式。它以简洁的方式描述复杂的字符串规律,广泛应用于编程语言、文本编辑器和各种数据分析工具中。在这个"正则表达式趣味例子集合"中,我们...
《正则表达式之道》是一本深入探讨正则表达式的资源集合,旨在帮助读者掌握这一强大的文本处理工具。正则表达式(Regular Expression)是一种模式匹配语言,它用于在字符串中进行查找、替换和提取特定模式的操作。在...
本资料压缩包包含了一系列关于Java正则表达式的视频教程,旨在帮助用户深入理解和熟练运用这一技术。 1. **正则表达式简介** - 正则表达式(Regular Expression)是由特殊字符和普通字符组成的模式,用于描述一...
- **网页抓取**: 通过正则表达式提取网页中的特定信息。 - **数据清洗**: 在大量文本数据中筛选出特定格式的数据。 - **输入验证**: 在前端表单中验证用户输入是否符合特定规则。 - **日志分析**: 在系统日志中...
通过这样的测试工具,用户不仅可以验证正则表达式的正确性,还可以学习和提升自己的正则表达式技能,使其在数据处理、文本分析、网页抓取等场景下更加得心应手。无论是专业开发者还是普通用户,掌握正则表达式都是...
如果需要从网页中抓取这些表格数据,一种常见的方法是使用正则表达式(Regular Expression),结合编程语言如Python的BeautifulSoup或JavaScript的DOM解析。本文将详细探讨如何利用正则表达式来提取`<tr>`和`<td>`...
掌握正则表达式不仅能够提高文本处理的效率,还能在许多领域发挥重要作用,比如网页抓取、数据清洗、文本分析等。使用正则表达式编辑器,可以更轻松地学习和应用这些概念,提升工作效率。在RegexTester这样的工具中...
正则表达式是一种强大的文本处理工具,用于匹配、查找、替换和分析字符串模式。它在编程、数据分析、网页抓取等多个领域中都有广泛的应用。"正则表达式小词典"是一个为了帮助学习者理解和查询正则表达式而设计的小型...
正则表达式广泛应用于数据验证、文本分析、网页抓取等多个场景。mtracer2.0是一款针对正则表达式的验证工具,它为开发者提供了一个直观且便捷的环境来测试和调试他们的正则模式。 1. **mtracer2.0特性** - **无需...
它是编程语言中不可或缺的一部分,特别是在数据处理、文本分析和网页抓取等场景下。本教程“正则表达式系统教程”旨在为初学者提供一个简单易懂的学习路径。 在正则表达式中,我们使用特殊字符(元字符)和构造来...
- **爬虫与数据分析**:在网页抓取和数据提取中,正则表达式帮助定位和提取目标信息。 9. **学习资源**: - 《正则表达式入门经典》:这是一本关于正则表达式的书籍,由瓦特撰写,提供了深入浅出的讲解和实例,...
Match Tracer是一款专为正则表达式设计的可视化编写及调试工具,它可以帮助用户更加直观地理解和构建复杂的正则模式,提高开发效率。 在编程和数据处理中,正则表达式扮演着至关重要的角色。它们可以用来验证输入...
在Web页面中,链接通常以`<a href="...">`的形式存在,通过正则表达式的匹配功能,可以精确识别并捕获这些链接地址,从而实现对网页内容的深度解析和数据提取。 ### 描述解读:“VB用正则表达式提取网页中的链接” ...