今日更新
技术新闻
精彩专题
IBM软件技术专区
微软开发专区
技术文档中心
编程语言
网络通信
网络安全
LINUX/UNIX
软件工程与管理
数据库开发
WEB开发
企业应用与开发
移动开发
资源中心
原创专栏
开放系统世界
人才与培训
技术天地论坛
厂商列表
社区推荐

· 女性身体内部人体受孕..
· 十部顶级的变态与情色..
· 感情放纵让我毁了两个..
· 当我撞见姐姐和男友在..
· 卖淫少女惨遭泄愤民工..
· 偷拍街上的走光mm绝对..
· 百度打击google的广告
· 港娱乐圈与黑社会揭秘
赛迪网>>技术应用>>重点推荐
关键字: Java;JDK;正则表达式
来  源: 赛迪网
比尔学Java:JDK1.4新特性之正则表达式篇 (1)
作者:Mac 发文时间:2002.10.30
学习是辛苦的,也是趣味十足的——这是比尔在学习Java的过程中总结出来的。看来,比尔已经找到了学习的乐趣。是什么让他有如此感受?还是让我们一起随比尔学下去吧。







比尔学Java
比尔学Java:Java Socket篇

比尔学Java:Java Datagram篇

比尔学Java:JDK1.4新特性之I/O APIs篇



前几天,比尔学习了JDk的I/O APIs特性,接下来,他接触到的就是JDK1.4中新增加的正则表达式(Regular Expressions)的应用。

今天,比尔没有学习详细的类方法的解释说明和代码示例,也没有直接去开发者联盟和大家探讨使用正则表达式的技巧(1),而是开始从正则表达式的基本概念出发,逐步接触Java中如何实现正则表达式的基本功能,还对正则表达式的优劣点作一些评价。

(阅读本文前,希望大家对正则表达式有个大概的了解,最好在其他语言中实际应用过。)

正则表达式的简介


我相信大多数人都或多或少地接触过正则表达式,最简单的例子,当你在Unix下使用“ls *.txt”列出文件的时候,当你在Windows下使用“dir *.txt”的时候,你其实就使用了正则表达式,即使你可能当时并没有意识到。我还清楚地记得当年我编写自己的自定义报表时,用正则表达式来检查公式的正确性。

说起正则表达式,就不得不提到美国数学家Stephen Kleene,他当初开发这些“规则的式子”(由此得名)来作为描述他的“the algebra of regular sets”的符号。他的这些工作也就是早期一些查找算法的雏形,并且导致Unix平台上最早一些字处理工具的出现。所以,“*”有时也被称为“Kleene star”。(2)

那到底什么是正则表达式呢?

正则表达式的概念

正则表达式,Regular Expression(也称为“regex”或“regexp”),是一种用来描述文本模式的特殊语法。一个正则表达式由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符,如/、*、?等)组成。简单地说,一个正则表达式就是你需要匹配的字符串。例如,正则表达式“A*B”匹配字符串“ACCCB”但是不匹配“ACCCC”。

正则表达式的应用


一般来说,正则表达式的应用主要体现在以下几个方面:

1、查找和替换

这是正则表达式最基本也是最常用的功能,如大部分文本编辑器都提供的查找替换功能。

2、验证

主要是检查输入字符串是否匹配特定的格式,比如最常用的Email验证。

3、解析

解析就是去粗取精,获取有用信息的过程,比如去掉一个文件中的控制字符。我还记得当初我在自定义报表的资产负债表中定义了这样一个公式:QCYE(科目编码),它表示某一科目在当前会计期间的期初余额。当用户最后需要计算出整个报表时,我就得找到QCYE这个公式,然后提取出科目编码,从数据库里查找出相应的数据返回到表格中。当然这里也涉及到一个验证的过程。

正则表达式在Java中的应用

我们知道,正则表达式在许多其他语言中得到了广泛的应用,诸如Python、Perl、PHP、Javascript、Jscript等。然而在JDK1.4以前,如果Java程序员需要利用正则表达式,他就不得不求助于第三方的类库,如IBM的regex for Java和Jakarta-ORO等(3)。或者自己用Java中的String、StringTokenizer等类来实现相应的功能,可想而知,那是多么地令人沮丧的一件事情。

现在好啦,JDK1.4在包java.util.regex中提供了针对正则表达式的功能。可喜的是,它非常简单,仅仅包括两个类(Pattern和Matcher)和一个违例(PatternSyntaxException),此外还涉及到一个相关的接口(CharSequence)。

Pattern类是正则表达式的编译表示,可以理解为正则表达式的封装器。此外它还负责生成Matcher类对象。

Matcher类负责解释Pattern类对象和在字符系列(character sequences)中寻找匹配的工作。

CharSequence接口是在java.lang包中新增加的。它表示字符的只读序列,提供对各种字符序列的统一的、只读访问。因为所有输入都是通过CharSequence接口来提供给Matcher对象,所以类CharBuffer、String、StringBuffer都重新实现了该接口。

Java中正则表达式的处理过程


Java中对正则表达式的处理过程是:首先正则表达式被封装进Pattern的类实例,接着由此Pattern类实例产生一个Matcher对象,最后由Matcher对象负责将正则表达式来匹配任意的字符系列(character sequences)。在整个匹配过程中产生的所有信息都保存在Matcher对象中,所以多个Matcher对象可以共享一个Pattern对象。

下面我们结合一个简单的例子来解释一下该过程中的每个步骤:

构建Pattern对象,由于Pattern类没有提供公用的构造器,所以我们调用静态的compile(String regex)方法。该方法实际上就是调用了Pattern类的私有的构造器方法。

Pattern pattern = Pattern.compile("([A-Z]{4})\\(([0-9]{3})\\)");


接着调用Pattern类的matcher(CharSequence input)方法生成Matcher对象,实际上也是调用了Matcher类的构造器方法。同时,要处理的字符系列作为参数传入,本例中为args[0]。

Matcher matcher = pattern.matcher(args[0]);


最后,由该Matcher对象来负责完成查找、验证和解析等工作。本例中Matcher对象完成对公式的解析并利用group()方法获得必要的参数。

/*************************程序清单*******************************/
/******此程序并不完整,为了简单起见,略去了其他的功能代码********/
/**
* <p>Title: FormulaRegex.java </p>
* <p>Description: 判断公式的合法性,并且从公式中获得参数。
* 公式的形式为XXXX(***),X表示大写字母,*表示0-9的数字</p>
 * @author Mac Wang
 * @version 2002/9/19
 */
import java.util.regex.*;

public class FormulaRegex
{
   public static void main(String[] args)
   {
      Pattern pattern = Pattern.compile("([A-Z]{4})\\(([0-9]{3})\\)");
      Matcher matcher = pattern.matcher(args[0]);
      if(matcher.matches()) //验证公式的正确性
      {
         System.out.print("Account Type:");
         System.out.println(matcher.group(1)); //获得第一个参数,公式类型
         System.out.print("Account Code:");
         System.out.println(matcher.group(2)); //获得第二个参数,科目编码
      }
      else
         System.out.print("No match,It's not a valid formula.");
   }
}


运行该程序:java FormulaRegex QCYE(101),将会得到如下的结果:

Account Type:QCYE
Account Code:101


本例主要涉及到正则表达式的验证和解析功能,至于查找和替换功能的实现,大家可以参考有关资料。其实,只要你能够熟练掌握Matcher类的主要方法并且注意正则表达式的一些特殊语法,我相信使用正则表达式对你来说是一件很简单而且非常有乐趣的事情。


1 2 下一页>>



赛迪网推出“IT博客”,花不到一分钟就完成注册
评论】 【推荐】 【 】 【打印】 【关闭

·Linux专区· ·黑客攻防·
· Linux下添加硬盘、分区、格式化任务详解
· FreeBSD服务器的安装与优化之优化篇
· 初学者入门:FreeBSD服务器的安装与优化
· 金企鹅杯两岸四地开源软件大赛圆满结束
· 如何提高Linux系统安全性的十大招数
· 构筑Linux防火墙之为个人用户设置防火墙
· 谁更安全?黑客眼中的防火墙与路由器
· 识破骗局 练就识别QQ活动真伪火眼金睛
· 应用安全大有可为:目的、挑战、总结
· 道高一尺魔高一丈:安全防御的动感魅力
· 警惕网络“内”院起火 积极谋求安内之路
· HHCTRL漏洞被黑客利用 疯狂传播木马
·中国信息化· ·成功案例·
· ERP普及化是饮鸩止渴 精细化才是应用之道
· 赛门铁克第八期《互联网安全威胁报告》解析
· 抢食“数字工商” 国产中间件杀出血路
· 从IBM等操作系统的发展看软件创新的启示
· 服务成就蓝色快车 品牌是怎样炼成的?
· 三大技术应用大会合为一体甲骨文上演三重奏
· 南阳教育城域网 拆掉学校间的“围墙”
· 金算盘助申意美步入信息化快车道
· 不为人知的索尼信息化 谁是幕后英雄?
· InforBus/Q在穗高速路联网收费系统中的应用
· J2EE构建最新金融理念和运作模式的网上银行
· 食品安全令人担心 信息化能否保驾护航
*姓  名: 更多资料 了解方案 认识厂商
*单位名称:
*联系电话:
*电子邮件:
    
◆ 相关文章   ◆ 站内热点推荐
· Java与UML建模
· Java与UML交互图
· 在Java中保留Stereotype
· 在UML中表示Java继承和接口
· 用UML描述Java类
· 网管员论坛
· 开发者之家
· WLAN无限未来
· 我是如何掉进C#的……
· 中国“人件”非正式调查

   
合作网站: IBM dW中国网站 LinuxAID 软件工程专家网 中国系统分析员 UMLChina MATRIX Mobile2008 JavaResearch 华储网 UML软件工程组织 中国JAVA手机网 JAVA中文站 金山在线 海量科技