java

位置:IT落伍者 >> java >> 浏览文章

Java正则表达式详解(中)


发布日期:2021年11月27日
 
Java正则表达式详解(中)

应用实例

下面我们来看看JakartaORO库的一些应用实例

日志文件处理

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

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

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

图八匹配IP地址

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

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

图九匹配至少一个字符直至找到]

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

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

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

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

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

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

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

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

HTML处理实例一

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

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

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

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

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

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

分割结果为

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

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

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

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

本例的输出结果如下

               

上一篇:JAVA调用ICE接口实践

下一篇:从Firefox访问Java Plug-in