栏目分类
开源技术 | Hibernate | JUnit | Tomcat | JBoss | eclipse | Spring | ANT | Struts
java新手入门 | 基础入门 | 开发工具 | JDK | oop面向对象 | 安全配置
J2EE | mvcwea | 应用服务器 | Rmi/Corba/Jini | J2ee核心 | Servlet/JSP | EJB | JDBC/JDO
J2ME | 核心技术 | 嵌入式 | 无线开发
XML | WebServices | XMLBeans
高级技术 | 多线程 | 设计模式 | ULM/OO | p2p/Jxta | JavaSecurity
核心技术 | SwingAwtApplet | 高级编程 | 网络编程 | Jvm技术 | JavaMedia
其它技术 | 资讯动态
排行榜
·Jasperreport报表开发指南
·Java正则表达式详解(中)
·Java技巧:使用Runtime.exec重定向本地程序调用
·什么是面向对象的设计思想?
·一些错误地解决方法
·Java正则表达式详解(上)
·java语言操作Oracle数据库中的CLOB数据类型
·Java虚拟机类装载:原理、实现与应用
·复制文件夹内容和删除整个文件夹的2个函数
·如何实现用jacob来调用word的宏
·Java操作Word,Excel,Access,IE,OutLook,PDF等
·用java编写的小游戏源代码分析
·利用JAVA操作EXCEL文件
·在CMPP2.0协议SP端的.NET开发
·JSP:javascript实现输入多行动态输入
·Java高级编程之displayTag学习摘要
·Java正则表达式详解(下)
·一种纯Java的数据库—JDataStore
·分享搞定的CLOB字段存取的代码
·图解VisualStudio.Net团队开发

    您现在的位置: Linux宝库 >> Java >> 核心技术 >> 高级编程 >> 文章正文
Java正则表达式详解(中)
Linux宝库 收集整理  作者:Linux宝库  时间:2007-12-31  收藏本站
来自:http://doc.linuxpk.com/44575.html
联系:linuxmine#gmail.com
分类:[高级编程]
  三、应用实例

  下面我们来看看Jakarta-ORO库的一些应用实例。

  3.1 日志文件处理

  任务:分析一个Web服务器日志文件,确定每一个用户花在网站上的时间。在典型的BEA WebLogic日志文件中,日志记录的格式如下:

  

  分析这个日志记录,可以发现,要从这个日志文件提取的内容有两项:IP地址和页面访问时间。你可以用分组符号(圆括号)从日志记录提取出IP地址和时间标记。

  首先我们来看看IP地址。IP地址有4个字节构成,每一个字节的值在0到255之间,各个字节通过一个句点分隔。因此,IP地址中的每一个字节有至少一个、最多三个数字。图八显示了为IP地址编写的正则表达式:

  

  图八:匹配IP地址

  IP地址中的句点字符必须进行转义处理(前面加上“\”),因为IP地址中的句点具有它本来的含义,而不是采用正则表达式语法中的特殊含义。句点在正则表达式中的特殊含义本文前面已经介绍。

  日志记录的时间部分由一对方括号包围。你可以按照如下思路提取出方括号里面的所有内容:首先搜索起始方括号字符(“[”),提取出所有不超过结束方括号字符(“]”)的内容,向前寻找直至找到结束方括号字符。图九显示了这部分的正则表达式。

  

  图九:匹配至少一个字符,直至找到“]”

  现在,把上述两个正则表达式加上分组符号(圆括号)后合并成单个表达式,这样就可以从日志记录提取出IP地址和时间。注意,为了匹配“- -”(但不提取它),正则表达式中间加入了“\s-\s-\s”。完整的正则表达式如图十所示。

  

  图十:匹配IP地址和时间标记

  现在正则表达式已经编写完毕,接下来可以编写使用正则表达式库的Java代码了。

  为使用Jakarta-ORO库,首先创建正则表达式字符串和待分析的日志记录字符串:

  

  这里使用的正则表达式与图十的正则表达式差不多完全相同,但有一点例外:在Java中,你必须对每一个向前的斜杠(“\”)进行转义处理。图十不是Java的表示形式,所以我们要在每个“\”前面加上一个“\”以免出现编译错误。遗憾的是,转义处理过程很容易出现错误,所以应该小心谨慎。你可以首先输入未经转义处理的正则表达式,然后从左到右依次把每一个“\”替换成“\\”。如果要复检,你可以试着把它输出到屏幕上。

  初始化字符串之后,实例化PatternCompiler对象,用PatternCompiler编译正则表达式创建

  

  现在,创建PatternMatcher对象,调用PatternMatcher接口的contain()方法检查匹配情况:

  

  接下来,利用PatternMatcher接口返回的MatchResult对象,输出匹配的组。由于logEntry字符串包含匹配的内容,你可以看到类如下面的输出:

  

  3.2 HTML处理实例一

  下面一个任务是分析HTML页面内FONT标记的所有属性。HTML页面内典型的FONT标记如下所示

  

  程序将按照如下形式,输出每一个FONT标记的属性:

  

  在这种情况下,我建议你使用两个正则表达式。第一个如图十一所示,它从字体标记提取出“"face="Arial, Serif" size="+2" color="red"”。

  

  图十一:匹配FONT标记的所有属性

  第二个正则表达式如图十二所示,它把各个属性分割成名字-值对。

  

  图十二:匹配单个属性,并把它分割成名字-值对

  分割结果为:

  

  现在我们来看看完成这个任务的Java代码。首先创建两个正则表达式字符串,用Perl5Compiler把它们编译成Pattern对象。编译正则表达式的时候,指定Perl5Compiler.CASE_INSENSITIVE_MASK选项,使得匹配操作不区分大小写。

  接下来,创建一个执行匹配操作的Perl5Matcher对象。

  

  假设有一个String类型的变量html,它代表了HTML文件中的一行内容。如果html字符串包含FONT标记,匹配器将返回true。此时,你可以用匹配器对象返回的MatchResult对象获得第一个组,它包含了FONT的所

  

  接下来创建一个PatternMatcherInput对象。这个对象允许你从最后一次匹配的位置开始继续进行匹配操作,因此,它很适合于提取FONT标记内属性的名字-值对。创建PatternMatcherInput对象,以参数形式传入待匹配的字符串。然后,用匹配器实例提取出每一个FONT的属性。这通过指定PatternMatcherInput对象(而不是字符串对象)为参数,反复地调用PatternMatcher对象的contains()方法完成。PatternMatcherInput对象之中的每一次迭代将把它内部的指针向前移动,下一次检测将从前一次匹配位置的后面开始。

  本例的输出结果如下:

  

  本文来自:http://doc.linuxpk.com/44575.html

 
     最新更新
·浅谈JAVA中类的构造器
·Linux+Java=Lava(岩浆)?
·重载与覆盖
·深入理解Java延迟绑定
·类和对象的兼容性
·数组和第一类对象
·纯继承与扩展
·继承和finalize()
·构建器的调用顺序
·内部类标识符
·内部类可以覆盖吗?
·从内部类继承
·引用外部类对象
·static内部类
·链接到外部类
·方法和作用域中的内部类
·内部类和上溯造型
·好的JAVA风格
·彻底明白Java的IO系统
·Javadoc利弊分析
·http断点续传简单实现
·Java的测试规范
·从JAR文件中读取文件
·我的面向对象程序观
·JBuilderX初体验
·Java接口的妙用
·Java相关的编译技术
·Java2D功能概述
·Java操作Word,Excel,Access,IE,OutLook,PDF等
·Java程序的加密和反加密