名称解释
正则表达式(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的正则表达式有了一些简单的认识,以后在写复杂报表的时候就会多一种选择,如果想要熟练的运用,就需要各位在实际工作中多多的练习和揣摩