分类: Oracle
2014-07-10 11:24:31
正则表达式是很多编程语言中都有的。可惜oracle8i、oracle9i中一直迟迟不肯加入,好在。你可以在oracle10g中使用正则表达式肆意地匹配你想匹配的任何字符串了。
所谓正则表达式是对于字符串进行匹配的一种模式。举个例子来说字符串’^198[0-9]$’可以匹配‘1980-1989’,也即80后出生的年份。如果希望统计出公司那些员工是80后的,就可以使用如下的SQL语句:
select * from emp where regexp_like(to_char(birthdate,’yyyy’),’^198[0-9]$’);
这里用到了regexp_like和函数。
这里在正则表达式中用到的^、$、[0-9]都被称为元数据(metacharacter),正则表达式都是由多元表达式组成的。在这里,^表示一个字符串的开头,$表示一个字符换的结尾,因此^198表示以198开头的字符串,而[0-9]$则表示以0-9的数字结尾的字符串。因此整体上’^198[0-9]$’就能匹配所有1980-1989的字符串。
正则表达式中常用到的元数据(metacharacter)如下:
这里列出的是一些常见的正则表达式中的元数据。更多的正则表达式的内容请参照oracle官网上的正则表达式的相关内容
关于orace中的正则表达式只能通过oracle特意为正则表达式设计的4个函数来使用。这4个函数分别是:
regexp_like,regexp_instr,regexp_replace,regexp_substr。关于这4个函数的具体用法,会在稍后介绍,这里简单说一下:
前面我们介绍了组常用的一个,这里我们在介绍一个函数regexp_instr。这个函数用的不如前一个多,但也会偶尔会用到。这个函数其实与我们前面曾介绍的其实相似。
regexp_instr的原型如下:
regexp_instr(x,pattern[,start[,occurrence[,return_option[,match_option]]]])
这里每个参数分别含义如下:
下面来举几个有关regexp_instr函数的例子:
select (’i love ’,'o[[:alpha:]]{4}e$’,1,1) as r from dual
这个例子从’i love ’这个字符串中匹配一个模式,这个模式是以o开头,以e结尾,在o和e之间有4个字符的字符串。这样自然而然就返回oracle的起始位置14
另一个例子是:
select (’i love ’,'o[[:alpha:]]{2}’,1,2,1) as r from dual
这个例子的含义是在’i love ’这个字符串中匹配另一个模式,这个模式是以o开始,再包含两个字符的一个模式,因此这个模式可以是ove,也可是ora但是我们要求它匹配两次,因此这个SQL语句的结果是ora所在的位置,所在的什么位置呢?因为我们的return_option参数的值是1,即大于0,所以这的结果是16,也就单词oracle中a所在的位置