基于正则表达式的数据处理应用
2010-09-08谭玉玲
谭玉玲
(罗定职业技术学院电子信息工程系,广东罗定 527200)
随着数据库技术的不断发展,数据库中存储的数据量越来越大,数据处理工作也越来越复杂。数据库中的操作大都是通过数据库管理系统(DBMS)提供的标准SQL语句来实现的。为了提高数据处理效率,人们提出了很多优化方法,如建立视图,减少LIKE条件的使用等[1-3]。这些优化方法都是建立在标准SQL语句基础之上的。而标准SQL语句在执行复杂的操作时,本身就存在着一些不足。例如,要从好友联系表Table中查询满足条件“QQ号字段中以10、11、12开头,以8结尾”的所有好友记录,则可以使用如下的标准SQL语句进行查询:
上述SQL语句采用谓词LIKE的方式来进行模式匹配,检索条件明确,运行后可以得到正确的结果,但是语句却显得有点冗长。语句中的百分号(%)可代表任意多个字符。如果要对QQ号字段的长度进行限制,就势必会增加SQL语句的复杂度。如果仅仅使用标准的SQL语句执行查询操作,不仅难以编写复杂的查询语句,还可能会降低程序的查询效率。更为糟糕的是,一旦SQL语句出错,难以进行排查和改错。
实际上,对于模式匹配,正则表达式提供了更高效且更佳的解决方案。运用正则表达式强大的模式匹配功能,可以通过简单的语句实现匹配工作,完成复杂的数据处理。
1 正则表达式的优点
正则表达式是一种源于Unix的强大的数据检索技术,它是由普通字符(如a~z之间的字母)和特殊字符(称为“元字符”)组成,不仅允许用户对检索条件有更灵活的控制,而且对电话号码、email地址和文件名等规范格式也非常有用[4-6]。正则表达式是定义复杂查询的一个强有力工具,它定义一个字符串的规则,使用了某些特殊的语法结构,能够匹配更多的字符串。
熟练运用正则表达式的特殊字符,可以对字符串执行许多复杂而高级的操作,可以实现:
(1)测试字符串的模式。如可以对用户输入的字符串进行测试,看该字符串是否为一串数字。
(2)查找。根据模式匹配从字符串中提取子字符串,可以用来在文本或输入字段中查找特定文字,这也是最常见的操作。
(3)替换文本。在文档中使用一个正则表达式来表示特定文字,然后可以将其全部删除,或者替换为别的文字。在SQL语句中,要使用正则表达式强大的模式功能,需要借助SQL中新引入的一些谓词。使用SQL提供的谓词REGEXP_LIKE和正则表达式中的某些特殊字符,则上述查询QQ号字段的操作可通过下面的SQL语句完成:
可见,通过引入正则表达式,原先的SQL语句被大大简化了。除了上面使用的谓词REGEXP_LIKE之外,SQL还提供了其他3个谓词,分别是REGEXP_INSTR、REGEXP_SUBSTR 和 REGEXP_REPLACE。它们的用法和SQL中的一般谓词INSTR、SUBSTR和REPLACE相似。由于它们是用正则表达式代替一般谓词中的通配符“%”和“_”,因此模式匹配功能要强大得多。如果对上述的QQ号查询操作再加以条件限制:要求QQ号以10、11、12开头,以8结尾,且号码长度不超过8位数字,使用标准的SQL语句,完成这样的查询工作几乎不可能,但是如果使用正则表达式,则查询语句十分简单,如下所示:
2 正则表达式的应用
2.1 创建数据库表
由于正则表达式在模式匹配方面的强大优势,很多大型数据库软件厂商的产品,如Oracle公司的 Oracle 10g、微软的 SQL Server 2005、IBM公司的DB2都开始支持正则表达式的使用[7-8]。
下面以Oracle 10g平台下开发使用的学员信息管理系统为例,详细介绍正则表达式在数据库操作中的应用。
首先,要建立学员信息数据库表,该数据库包含的字段信息有用户名、密码、QQ号、email和学习卡号。为了能够更详细地掌握学员的信息,学习卡号的数据应符合如下格式:**-****-****(*代表数字0~9)。其中,前两位数字表示该学员的入学年份,中间的4位数字表示该学员所在城市的区号,后4位数字表示学员的序号。如学习卡号08-0731-1024表示是08年长沙地区序号为1024的学员。
具体的SQL语句如下:
本研究通过对我院收治的40例儿茶酚胺增多症患者临床资料的回顾性分析,可知了解儿茶酚胺增多症患者的自身状况,及时进行针对性手术治疗,能够取得较好效果,值得临床推广。
在上面的SQL语句中,正则表达式REGEXP_LIKE(stucard,′^([[:digit:]]{2}- [[:digit:]]{3,4}- [[:digit:]]{4})$ ′)给出了判断学习卡号stucard是否符合规定的实现细节,即stucard是由任意两个数字开头,后接连字符“-”,再接3位或4位任意数字,随后又是连字符“-”和任意4位数字,最后符号“$”为结尾符。其中,表达式中的[[:digit:]]完成匹配数字0~9的任务,表达式{2},{3,4},{4}用来控制数字需要重复的次数。如果stucard字段的格式判断由标准SQL语句来实现,将会十分困难。
完成数据库表创建工作后,就可以插入学员记录。以插入两条学员记录为例,相应的SQL语句如下:
以上插入记录的stucard字段都符合规定格式,因此,能够正确插入到数据库表中。但是如果执行下面两条插入数据记录的操作:
由于第一条记录stucard中025只包含3个数字,第二条记录stucard中01只包含2个数字,格式不合规定,会导致错误提示,插入记录后的错误提示界面图如图1所示。
2.2 设计匹配模式
在创建数据库表的时候,并没有给出用户名、密码、email等字段的约束条件。但在实际应用中,这些字段也要符合相应的规则[9-10],可以通过正则表达式设计的匹配模式来实现这些规则。设计匹配模式,首先要定义构成规则,然后再利用正则表达式的语法进行描述。下面给出上述几种字段的匹配模式的设计。
图1 插入记录后的错误提示界面图
(1)用户名的匹配模式。若用户名的构成规则是至少4个字符或汉字,至多20个字符或汉字,则匹配模式为“^.{4,10}$”。
(3)email的匹配模式。一个合理的email地址至少要满足以下条件:①包含一个且只有一个符号“@”;②“@”前至少有一个字符,且首字符只能是字母、数字和下划线,后面的字符可以是字母、数字和下划线,也可以是减号或圆点。若包含减号或圆点,则不能有两个或两个以上相邻,且后面必须有字符(字母、数字和下划线);③“@”后至少有一个字符,且首字符只能是字母或数字,后面的字符可以是字母或数字,也可以是圆点或减号。若包含圆点或减号,则不能有两个或两个以上相邻,且后面必须有字符(字母或数字);④最后要由圆点后跟至少一个字符(字母或数字)结尾。
根据上述原则,利用正则表达式的语法,可以得到如下模式匹配:“^w+((-w+)|(.w+))*@[A-Z a-z 0-9]+((.|-)[A-Z a-z 0-9]+)*.[A-Z a-z 0-9]+$”。
2.3 创建触发器
基于上述匹配模式,可以创建触发器来进行数据操作的控制。笔者以创建用户名和email触发器为例,给出具体的SQL语句:
(1)基于用户名匹配模式的触发器创建。
触发器创建后,当插入记录时,首先判断REGEXP_LIKE的返回值是否为真,如果返回值为假,表示输入数据的格式不符合规定,就会触发执行相应的SQL语句并提示错误。
如当分别插入下面两条记录,记录1的用户名“lil”只包含3个字符,记录 2的 email地址“lucyyahoo.com.cn”没有包含字符@,因此会导致触发器cs1和cs2被分别触发执行,运行结果如图2所示。
图2 触发器执行结果
3 结论
正则表达式是一种用来进行字符串模式匹配的强有力工具。将其应用于标准SQL语句中,不仅可以实现复杂的数据处理操作,而且还简化了SQL语句的复杂度,使对出错语句的修改工作变得更加简单方便。
通过正则表达式在学员管理系统中的数据处理应用,给出了详细的语法规则和实现细节,对提高数据处理的效率和简化数据处理的复杂度,具有较大的实用价值和参考价值。
[1]王振辉,吴广茂.SQL查询语句优化研究[J].计算机应用,2005(12):207-208.
[2]陈怡,卿峰.在C语言中使用正则表达式[J].华南金融电脑,2004(4):57-58.
[3]李村和,孙运雷.正则表达式在Oracle中的应用与实现[J].微计算机应用,2005(2):240-242.
[4]GONZALO N,MATHIEU R.New techniques for regular expression searching[J].Algorithmica,2005,11(41):89-116.
[5]YU F,CHEN Z F,DIAO Y L,et al.Fast and memory-efficient regular expression matching for deep packet inspetion[C]∥Proc of the 2006 ACM/IEEE Symposium on Architecture for Networking and Communications Systems.San Jose:ACM/IEEE,2006:93-102.
[6]陈立娜.面向制造业的主动搜索平台的研究与实现[J].现代计算机,2009,3(2):56-58.
[7]白琳.正则表达式在动态网页开发中的应用[J].湖南科技学院学报,2009,30(2):47-49.
[8]王燕,李冬梅.基于正则表达式的协议识别方案[J].教育技术导刊,2009(2):30-32.
[9]王琳琳.基于HTML解析器的Web信息提取技术[J].郑州轻工业学院学报:自然科学版,2008(6):25-29.
[10]李文鹏..Dot Net正规表达式应用研究[J].教育技术导刊,2009(1):36-38.