Oracle Database 10g对正则表达式的支持分析

来源 :电脑知识与技术·学术交流 | 被引量 : 0次 | 上传用户:swl3322
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:正则表达式是源于Unix系统的一种非常强大的数据检索技术。Oracle Database 10g开始新增加了一种功能特性:支持正则表达式。论文主要介绍正则表达式的概念和基本语,并分析Oracle 10g数据库中对正则表达式的支持描述,最后通过例子分析如何在数据库应用程序设计中应用正则表达式。
  关键词:Oracle;正则表达式;数据库开发
  中图分类号:TP311文献标识码:A 文章编号:1009-3044(2008)27-1869-03
  The Analysis of Supporting Regular Expression in Oracle Database 10g
  GU Yun-feng
  (Jinling Institute of Technology, Nanjing 210001, China)
  Abstract:Regular Expression is a kind of very strong data index technique that comes from the Unix system. The oracle database 10g started to add a kind of new function characteristic: support the regular expression. This text mainly introduces the concept of Regular Expression, and analyses the description of how the Oracle database 10g supports the regular expression, finally through some examples analyses how to apply regular expression in the procedure of database application design.
  Key words:Oracle; regular expression; database develop
  
  1 前言
  
  Oracle数据库在有效地存储和管理大数据容量方面有着出色的能力。比如Oracle 10g中可以存储8千兆兆字节或8388608万亿字节的数据。随着数据容量的不断增长,对数据的实时方式的访问和提供更为灵活和有效的处理方式就变得越来越重用了。为了适应这种需求,Oracle公司在database 10g版本中新增加了一种功能特性:支持正则表达式。
  
  2 正则表达式的概念
  
  正则表达式是为了编程处理文本对文本模式进行描述的方式。正则表达式是源于Unix系统的一种非常强大的数据检索技术。它是由元字符(metacharacter)与规则字符组成,答应用户对搜索条件有更灵活的控制。而且对于规范像电话号话、email地址、文件名等的格式也非常有用。
  正则表达式由标准的元字符(metacharacters)所构成。那么什么是元字符?元字符提供了如何组成一个正则表达式的运算法则。不同的元字符对应着不同的意义。具体来说,Oracle支持的元字符有如下一些:[1]
  · ’^’ 表示字符串的开始
  ·’$’ 表示字符串的结束
  ·’.’ 表示任何字符
  ·[]表示字符的范围,比如说’[a-z]’,表示任何ASCII小写字母,与字符类"[[:lower:]]"" 等价
  ·’?’ 答应一个后继字符匹配零次或一次
  ·’ ’ 答应一个后继字符匹配一次或多次
  ·’*’ 表示零次或多次
  可以使用"{m,n}"指定一个精确地出现范围,其意思是“出现从m次到n次”;"{m}" 表示“正好m次”;而"{m,}"表示“至少m次”。还可以使用圆括号组合字符的集合,使用""(竖线)表示可替换。例如,字符串’^([a-z] [0-9] )$’将匹配所有由小写字母或数字组合成的字符串。
  数据有效性的确认、文字过滤、字符串的分析等等都是正则表达式中可以使用的地方。因此可以通过正则表达式来确保电话号码、邮政编码、email地址、身份证号、IP地址、文件路径名等等的正确性。而且,可以将匹配样式定为HTML标签、数字、日期或者任何东西,只要他们处在一个文本类型的数据中并且匹配一定的模式,而且可以以任何其他的模式来替换他们。
  
  3 Oracle10g支持基于POSIX标准的正则表达式
  
  在Oracle Database 10g以前,应用程序开发人员在数据库应用程序里可以有几种方法处理文本数据。例如通过SQL操作符如LIKE、INSTR、SUBSTR和REPLACE等进行基本的文本操作。或者是使用Oracle Java虚拟机,即装载一个正则表达式处理器的Java实现。有了Database 10g版本,就可以有更有效、更直观、可移植、更容易维护的方法来解决这个问题。因为Oracle 10g版本中在数据库SQL引擎内部本地性支持正则表达式。Oracle Database 10g的正则表达式的实现基于POSIX标准定义的语法和语义-这是一个广泛使用的、方便的正则表达式。
  Oracle Database10g对正则表达式的支持是作为搜索和操作文本数据的数据库函数集来实现的。Oracle Database10g提供了四个新的函数,分别是:REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR和REGEXP_REPLACE。它们在用法上与Oracle SQL函数LIKE、INSTR、SUBSTR 和REPLACE用法,但是它们使用POSIX正则表达式代替了老的百分号(%)和通配符(_)字符,并且支持char、nchar、varchar2、nvarchar2、clob和nclob等数据类型作为输入参数。[2]
  (1) REGEXP_LIKE
  REGEXP_LIKE与LIKE操作符相似,是返回一个boolean数据。它指出模式是否匹配给定的字符串。它不提供字符串中发生匹配的方式和位置。假如第一个参数匹配正则表达式它就解析为TRUE。
  该命令语法如下:
  REGEXP_LIKE(src,pattern[,match_option])
  其中src是要搜索的文本数据,pattern是设计的正则表达式,match_option是匹配的可选项。
  例如WHERE REGEXP_LIKE(ENAME ,’^J[AO]’,’i’) 将在ENAME以JA或JO开始的情况下返回一行数据。’i’参数指定正则表达式是大小写敏感的。
  (2) REGEXP_INSTR
  REGEXP_INSTR与INSTR函数类似。主要是返回与模式相匹配的字符的开始或结尾的字符位置。
  其语法如下:
  REGEXP_INSTR(src,pattern[,position [,occurrence [,return_option [,match_option]]]])
  其中:src是要搜索的文本数据;pattern是设计的正则表达式;position是开始搜索的位置;occurrence是指匹配出现的次数;return_option 可选0或1,0表示返回开始位置,1表示返回结束位置;match_option是匹配的可选项。
  它返回一个字符串中匹配一个正则表达式的第一个子串的开始位置。
  例如:SELECT REGEXP_INSTR(’The total is $400 for your purchase.’,’$[[:digit:]] ’) FROM DUAL;
  这个查询返回14,即$400在字符串的开始位置。
  (3) REGEXP_SUBSTR
  REGEXP_SUBSTR函数扩展了substr的功能,可以在一个文本数据中搜索一个正则表达式,并返回匹配模式的数据。
  命令语法如下:
  REGEXP_SUBSTR(source_string,pattern[,position [,occurrence [,match_option]]])
  其中各参数的意义如同REGEXP_INSTR。虽然结合使用SUBSTR和REGEXP_INSTR及LENGTH也可以实现这一功能,但是使用这个函数却更为简单。
  例如:SELECT REGEXP_SUBSTR(’first field,second field,third field’,’, [^,]*,’) FROM dual;
  这个查询返回",second field,"字符串。
  (4) REGEXP_REPLACE
  REGEXP_REPLACE函数扩展了replace的功能,返回初始参数被匹配子串替换之后的结果即src数据。
  命令语法如下:
  REGEXP_REPLACE(src,pattern[,replace [,position [,occurrence [,match_option]]]])
  其中src、pattern、position、occurrence、match_option参数意义如同其他函数;replace参数表示要更换的正则表达式,可包含向后引用实例,格式是\n,这里n是1到9的数字。
  例如:
  SELECT REGEXP_REPLACE(’The temperature is 23°F’,’([[:digit:]]) °F’,(’\1’-32)*5/9’°C’) FROM DUAL;
  这个查询将查找一个华氏温度并将其转换为摄氏度。它将返回:’The temperature is -5°C’。
  再例如:
  SELECT REGEXP_REPLACE(’Ellen Hildi Smith’,’(.*) (.*) (.*)’, ’\3, \1 \2’) FROM dual
  该查询结果如下:Smith, Ellen Hildi。这个例子中间,字符串’Ellen Hildi Smith’被REGEXP_REPLACE通过向后引用实例即’\3, \1 \2’转换为’Smith,Ellen Hildi’。[3]
  通过上面的简单例子,可以看到正则表达式能够让我们可以以以前从未想过的方法来查询、更换、验证数据,并且有着高度的灵活性。
  
  4 Oracle Database 10g正则表达式使用举例
  
   数据库中正则表达式的引入使构建和设计一个应用程序的方式有了新的灵活性。有了这些新的功能,就有可能将越来越多的客户端应用程序或中间层的处理移到实际数据处进行,进而有效利用了数据库固有的可扩展性、安全性和全局性。
  4.1 创建视图
  视图一般用于格式化一个关系型查询,或找出关系型查询的子集,这样就会将正确格式下正确数量的信息返回到客户端。我们在数据库应用程序开发时,可以借助正则表达式执行这些功能。
  例如下面代码创建一个试图来显示product_information表中的子集,其条件满足描述信息包含文本“Standard Edition”或“professional Edition”。对视图进行的查询只显示具有匹配描述的行。
  CREATE OR REPLACE VIEW v1 AS
  SELECT product_name,product_description
  FROM product_information
  WHERE REGEXP_LIKE(product_information,’(Standard|professional) Edition’)
  而且,为了格式化查询结果,我们可以通过使用regexp_replace,将产品的版本包括在加粗的标记(,)中。具体代码如下:
  CREATE OR REPLACE VIEW v2 AS
  SELECT product_name,REGEXP_REPLACE(product_description,’(Standard| professional) Edition’,’\1’)formatted_description FROM product_information WHERE REGEXP_LIKE(product_information,’(Standard| professional) Edition’)
  4.2 创建约束
  正则表达式可与数据库约束一起来使用来验证数据条目的有效性。
  下面代码中显示了我们在创建数据库表时创建一个check约束,它强制电话号码为xxx-xxxxxxxx格式。
  CREATE TABLE t1 (
  Telephone VARCHAR2 (12),
  CHECK (REGEXP_LIKE(Telephone,’^[0-9]{3}-[0-9]{8}$’))
  );
  通过创建此约束,任何试图将不符合该格式的电话号码插入到表中的操作都违背类约束,因此被拒绝。
  另外我们也可以为已经存在的表添加在CHECK约束和函数索引中指定REGEXP_LIKE。例如编写如下语句:
  ALTER TABLE EMP ADD CONSTRAINT REGEX01CHECK (REGEXP_LIKE(ENAME,’^[[:alpha:]] $’));
  这条语句使得ENAME字段只能包含字母和数字字符(也就是说没有空格或者标点符号)。试图插入或者更新这些数据将导致一个ORA-2290异常,或者检查约束的有效性。
  4.3 创建函数
  函数是执行某种功能的代码块,它拥有可供引用的标识符,并且拥有可以传递信息的参数。Oracle允许根据特殊的需要,创建自定义的函数。我们在设计自定义函数时就可以充分利用正则表达式,来扩展数据库函数的功能。下面的示例就是创建一个使用正则表达式的Oracle自定义函数,用于验证身份证号码合法性。
  CREATE OR REPLACE FUNCTION fn_checkidcard (p_idcard IN VARCHAR2)
  RETURN INT //函数返回int类型的数据
  IS
  v_regstrVARCHAR2 (2000);//正则表达式pattern字符串
  v_areacodeVARCHAR2 (2000):= ’11,12,…91,’;//身份证地区代码:例如11:北京,12:天津…91:国外等
  BEGIN
  CASE LENGTHB (p_idcard)//判断身份证号码的位数
  WHEN 18//身份证为18位
  THEN
  IF INSTRB(v_areacode,SUBSTR (p_idcard,1,2)||’,’) = 0
  THEN
  RETURN 0;// 身份证号中地区代码是非法的,函数返回0
  END IF;
  IFMOD (TO_NUMBER (SUBSTRB (p_idcard,6, 2)) 1900,400) = 0OR (MOD(TO_NUMBER (SUBSTRB (p_idcard,6, 2)) 1900,100) <>0AND MOD (TO_NUMBER (SUBSTRB(p_idcard,6,2)) 1900,4) = 0)//判断出生日期是否为闰年
  THEN
  v_regstr:= '^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$';// 闰年出生日期的合法性正则表达式
  ELSE
  v_regstr:='^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$';// 平年出生日期的合法性正则表达式
  END IF;
  IF REGEXP_LIKE (p_idcard, v_regstr) //通过REGEXP_LIKE,判断身份证号是否匹配正则表达式模式
  THENRETURN 1;//匹配返回数字1 
  ELSERETURN 0;//不匹配返回数字0
  END IF;
  WHEN 15 THEN //身份证号码为15位
  …………//代码略
  ELSE
  RETURN 0;//身份证号码位数不对
  END CASE;
  EXCEPTIONWHEN OTHERS THEN RETURN 0;
  END fn_checkidcard;//结束函数
  
  5 结束语
  
  正则表达式的功能是非常强大的,它们帮助解决复杂的文本匹配问题。在数据库中很多以正则表达式构成的函数功能体是无法通过传统的SQL函数来复制的。当我们学会正确使用正则表达式,就会发现它不仅在SQL中使用,在其他的编程语言中Java语言中也得到广泛的支持,如Sun公司通过在jdk1.4的util包里增加了个regex包来正式支持正则表达的判定。虽然试验和犯错对获得正确的正则表达式模式有时是不可避免的,但是它的强大的功能还是值得我们在数据库程序开发中去尝试使用的。
  
  参考文献:
  [1] Alice Rischert.Writing Better SQL Using Regular Expressions [EB/OL].http://www.oracle.com/technology/oramag/webcolumns/2003/
  techarticles/rischert_regexp_pt1.html,2004.7.
  [2] (美)Rick Greenwald,Robert Stackowiak.Oracle高级编程[M].北京:清华大学出版社,2007,5,403.
  [3] Alice Rischert.Writing Better SQL Using Regular Expressions [EB/OL]. .http://www.oracle.com/technology/oramag/webcolumns/2003/
  techarticles/rischert_regexp_pt2.html,2004.7.
  [4] 中国IT实验室.用正则表达式函数验证身份证号码合法性[EB/OL].http://www.builder.com.cn/2007/1007/537886.shtml,2007-10-07.
  
其他文献
摘要:以软件技术专业为例,在分析软件技术专业人才培养存在问题的基础上,提出提高人才培养质量的主要策略是深入推进校企合作,介绍了福建船政交通职业学院信息工程系软件技术专业校企合作的三个方面,以及在校企合作中的具体做法,对开展校企合作的高职院校有一定参考、借鉴价值。  关键词:软件技术;校企合作;人才培养  中图分类号:G642 文献标识码:A 文章编号:1009-3044(2015)36-0059-
摘要:随着高校招生规模的越来越大,给迎新工作带来一定的困难。该文介绍了苏州工业职业技术学院数字迎新工作的流程以及系统的设计与实现,该系统具有“网上迎新”和利用“一卡通”快速报到的功能,能有效解决高校在以往迎新工作中存在的过程复杂、效率底下、数据实时共享困难等问题,并且方便了学校各职能部门和各院系对新生信息的查询与管理。  关键词:迎新系统;新生报到  中图分类号:TP311 文献标识码:A 文章编
摘要:该文从笔者现实生活中的感悟出发,联系新形势下职业教育教学改革的历史及现状,并提出笔者自己的思路,分析讨论了职业教育的本质、课堂教学的起点、教学方法的选择等若干热点问题。  关键词:职业教育;教学改革;本质;起点  中图分类号:G424 文献标识码:A 文章编号:1009-3044(2014)12-2805-02  经历了学校从中专、重点中专、大专、品牌大专的蜕变,经历了服务年、管理年、提升年
摘要:李白抒写了颇多表现忧愁苦闷的诗篇,不遇、羁旅、离别、家室、感时、代拟之类,愁思情真意切,折射出诗人真实的生命状态。其人其诗给人以乐观豪迈、青云自致之感,乃缘于时代精神、个人人格及宗教信仰天然调和所得的中和美。  关键词:李白 旷达 愁思 调和  引言  李白乐观豪迈、青云自致的谪仙形象深入人心,但李诗集中贯穿着一条愁思线索。在《李太白全集》[1]中检索,“愁”字使用了141次,“忧”字41次
摘要:该文提出了一种基于ARM及GPRS技术的AMR(Automatic Meter Reading,自动抄表)系统设计的解决方案,使缩短开发周期,降低开发费用,提高抄表系统的稳定性和性价比成为可能。  关键词:ARM;GPRS;AMR;自动抄表;S3C44B0X;μC/OS-II  中图分类号:TP274文献标识码:A文章编号:1009-3044(2008)36-2687-02  A Syste
摘要:公共机房高职院校开展实践教学的重要场所,构建开放型公共机房是高职院校教育改革的当务之急。该文就高职院校开放型公共机房运行存在的制约因素展开分析,并据此提出了相应对策,同时就笔者学院实施开放型公共机房运行进行了经验总结。  关键词:开放型;公共机房;运行机制  中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2013)25-5677-03  公共机房是高职院校从事实践教学
摘要:煤矿监控系统在煤矿生产中具有重要作用,报警管理是监控系统的重中之重,通过语音报警操作员可以及时发现并处理一些重大报警,本文详细阐述了如何使用报警优先级、报警限制、报警条件、报警区域、报警计数器以及声音报警等报警技术解决错报、误报、重复报警等现象,如何制作语音报警以期在第一时间内获得报警信息。  关键词:监控系统;iFIX;语音报警;报警管理  中图分类号:TP311文献标识码:A文章编号:1
摘要:文章简单介绍了PSP个体软件过程的发展,及笔者在教学过程中的课程设置,就psp与数据库项目实训过程结合的方法及结果做出了分析。  关键词:个体软件过程;数据库管理系统  中图分类号:G424文献标识码:A文章编号:1009-3044(2008)24-1128-02  The Database Training Base on PSP  XIA Min, LONG Kai-hong  (Yiy
随着科技的发展,人们对于电子产品的需求越来越高,特别是以平板电脑为代表的移动互联产品,无论是从尺寸上还是配置上都有了翻天覆地的变化。而相对于尺寸较小的机型而言,10英寸平板电脑在娱乐和商务应用方面都能轻松胜任,成为替代PC机的完美选择!  一、10寸平板优劣  时下的潮男潮女们,平时喜欢沉浸在自己的世界里,借助移动网络设备,他们就可以独自坐在KFC、星巴克或自己房间里,看电影、玩网游、网络社交……
摘要:金盘图书馆集成管理系统(Gold Disk Library Integrated System,下文简称gdlis)是目前国内使用较为广泛的图书馆管理软件之一。该文通过湖南师范大学图书馆(下文简称我馆)在引进gdlis后对系统的应用实践,结合图书馆的具体工作流程,总结了gdlis在总分馆模式上的使用經验,并分析了其中的不足之处。  关键词:集成管理系统;图书馆;gdlis  中图分类号:TP