名称解释

       正则表达式(Regular Expression Support)通常是被用来检索或替换那些符合某个模式的文本内容一个公式。许多程序设计语言都支持利用正则表达式进行字符串操作,是一个处理文本非常有用的工具。oracle10g以前,我们在处理文本字符的时候,往往需要通过like和substr、instr、replace组合实现,比较麻烦,而oracle10g开始,可以通过REGEXP_LIKE、REGEXP_REPLACE、REGEXP_INSTR和REGEXP_SUBSTR结合正则表达式的元字符,对文本进行简单的检索和替换,下面我们就对其进行简单的介绍和举例。

元字符

       上面我们讲到了元字符,那什么是元字符呢?元字符是特殊字符,在正则表达式中具有特殊意义,如通配字符,重复字符,非匹配符或字符的范围等等。您可以使用多种预定义的模式匹配元字符,下面我们把正则表达式的元字符及其描述列举如下:

         

    接下来我们来对如何使用这些元字符举几个简单的例子。

       问题一:找到’abc’ 字符串

       解决:[abc]    意思就是必须匹配abc

       匹配:’abc’

       不匹配:’abd’

       问题二:找到’a’之后是任意字符,其次是’c’的字符

       元字符中’.’代表任意非空的字符

       方法:[a.c]     意思是必须匹配a中间是任意非空字符c结尾

       匹配:’abc’

       匹配:’adc’

       匹配:’afc’

       匹配:’a2c’

       不匹配:’abb’

       问题三:找到一次或者多次出现了’a’的字符

       元字符中’+’代表字符出现1次或者多次

       方法:[a+]    意思是出现1次或者多次a的字符

       匹配:’a’

       匹配:’aa’

       不匹配:’bbb’

       通过上面的例子,我们大概就应该知道了元字符的运用,合理的进行组合这些元字符,能够满足一些复杂的要求,在oracle 10g中要运用这些元字符,必须在其提供的正则表达式函数中引用,下面我们就介绍下前面也提到的4个正则表达式函数。

正则表达式函数

       在第一段的时候我们就提到了,Oracle 10g开始,提供了REGEXP_LIKE、REGEXP_REPLACE、REGEXP_INSTR和REGEXP_SUBSTR 四个函数来进行正则表达式的应用,他们的具体描述见下表:

他们的语法如下:

REGEXP_LIKE

语法:

REGEXP_LIKE (srcstr, pattern [,match_option])

例子:Select * From 人员表  Where REGEXP_LIKE (姓名, '^王(.)丽$')

说明:1.起点必须整个字符串匹配2.中间可以是任意字符3.$结尾必须整个字符串匹配,本例想匹配的结果人员姓名是’王’开头,’丽’结尾,中间是任意字符的人员。

结果:


REGEXP_INSTR

语法:

REGEXP_INSTR(srcstr,pattern[,position[,occurrence[,return_option[, match_option]]]])

例子:Select 姓名, Regexp_Instr(姓名, '[^[:alpha:]]') From 人员表 Where Regexp_Instr(姓名, '[^[:alpha:]]') > 1;

说明:找到第一个非字符在姓名中出现的位置

结果:


注:这里我们看到,空格也算非字符

REGEXP_SUBSTR

语法:

REGEXP_SUBSTR(srcstr,pattern[,position[,occurrence[,match_option]]])

例子:SELECT 规格,REGEXP_SUBSTR(规格 , '[^┆]+') As 剂量FROM 收费细目;

说明:返回规格中1个或者多个字符,直到出现’┆’

结果:


REGEXP_REPLACE

语法:

REGEXP_REPLACE(srcstr, pattern[,replacestr[,position [, occurrence [, match_option]]]])

例子:Select 费用类型,REGEXP_replace(费用类型,'(.)','\1 ') As 替代  From 收费细目

说明:在每个字符后面加一个空格

结果:


    通过上面的举例,大家了解了正则函数一些最简单的应用,在实际工作中,如果想实现一些复杂的应用,就需要我们对元字符和表达函数的进行合理组合,大家可以下来多尝试下。

检查约束

       除了上面的应用,Oracle还提供了正则表达式的在表中的检查约束的应用,这里给大家简单的举个例子。

       我们HIS系统中的人员表有个字段是电子邮件,一般情况下电子邮件的格式应该是xxx@xxx.com等,必定有个特殊字符@,我们就可以在这个字段创建检查约束,对其进行检查,语句如下:

ALTER TABLE 人员表 ADD CONSTRAINT 电子邮件    CHECK(REGEXP_LIKE(电子邮件,'@'))  NOVALIDATE

       这样,我们在人员表的电子邮件字段就建了一个检查约束,当我们要插入人员表的电子邮件字段数据时候,就会检查变更的字段是否有’@’特殊字符,如果没有就不允许插入和修改,如下:







结语

       通过前面的介绍,大家对oracle 10g的正则表达式有了一些简单的认识,以后在写复杂报表的时候就会多一种选择,如果想要熟练的运用,就需要各位在实际工作中多多的练习和揣摩