ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle中的正则表达式

Oracle中的正则表达式

原创 Linux操作系统 作者:xz43 时间:2011-11-16 16:16:31 0 删除 编辑

正则表达式是很多编程语言中都有的。可惜oracle8i、oracle9i中一直迟迟不肯加入,好在oracle10g中终于增加了期盼已久的正则表达式功能。你可以在oracle10g中使用正则表达式肆意地匹配你想匹配的任何字符串了。

所谓正则表达式是对于字符串进行匹配的一种模式。举个例子来说字符串’^198[0-9]$’可以匹配‘1980-1989’,也即80后出生的年份。如果希望统计出公司那些员工是80后的,就可以使用如下的SQL语句:

select * from emp where regexp_like(to_char(birthdate,’yyyy’),’^198[0-9]$’);

这里在正则表达式中用到的^、$、[0-9]都被称为元数据(metacharacter),正则表达式都是由多元表达式组成的。在这里,^表示一个字符串的开头,$表示一个字符串的结尾,因此^198表示以198开头的字符串,而[0-9]$则表示以0-9的数字结尾的字符串。因此整体上’^198[0-9]$’就能匹配所有1980-1989的字符串。

正则表达式中常用到的元数据(metacharacter)如下:

^  匹配字符串的开头位置。

$  匹配支付传的结尾位置。

*  匹配该字符前面的一个字符0次,1次或者多次出现。例如52*oracle 可以匹配 5oracle,52oracle,522oracle,5222oracle等等。

+ 匹配该字符前面的一个字符1次或者多次出现。例如52+oracle 可以匹配 52oracle,522oracle,5222oracle等等

?  匹配该字符前面的一个字符0次或1次或者多次出现。例如52?oracle 只能匹配5oracle,52oracle等等

{n} 匹配一个字符串n次,n为正整数。例如:hel{2}o 所匹配的是hello

{n,m} 匹配一个字符串至少n次,至多m次。其中n和m都是整数。

.  匹配除了null之外的任何单个字符串

(pattern) 这个是用来匹配指定模式的一个子表达式

x|y  匹配x或者y,其中x和y是一个或者多个字符

[abc] 匹配括号中的任意一个字符。例如:[ab]bc可以匹配abc和bbc

[a-z] 匹配指定范围内的任意字符串。例如[A-G]hi可以匹配Ahi至Ghi

[::]指定一个字符类,可以匹配该类中的任意字符 这里的字符类包括:

[:alphanum:] 可以匹配字符0-9、A-Z、a-z

[:alpha:]可以匹配字符A-Z、a-z

[:blank:]可以匹配空格或者tab键

[:digit:]可以匹配数字 0-9

[:gragh:]可以匹配非空字符

[:punct:]可以匹配. , ” ‘等标点符号。

[:upper:]可以匹配字符A-Z

[:lower:]可以匹配字符a-z

这里列出的是一些常见的正则表达式中的元数据。更多的正则表达式的内容请参照oracle官网上的正则表达式的相关内容

关于orace中的正则表达式只能通过oracle特意为正则表达式设计的4个函数来使用。这4个函数分别是:

regexp_like(x,pattern)当x能正确匹配字符串时返回true。

regexp_instr(x,pattern)在x中尝试匹配pattern,并返回匹配的位置。

regexp_replace(x,pattern,replacestring)在x中尝试匹配pattern,并将其替换成replacestring。

regexp_substr(x,pattern)返回x中匹配pattern的一个字符串。

它们在用法上与Oracle SQL 函数LIKE、INSTR、REPLACE 和SUBSTR 用法相同,但是它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符。

 

regexp_like的原型如下:

regexp_like(srcstr ,pattern ,[match_option])

这里每个参数分别含义如下:

srcstr  待匹配的字符串

pattern 待匹配的模式

match_option 可以用这个参数来修改一些默认的配置设置。

其基本功能是在srcstr中查找pattern,如果能找到返回true否则返回false,这里的可选参数match_option可以有如下几种形式:

‘c’ 表明进行匹配时区分大小写(这也是默认选项);

‘i’  表明在匹配时不区分大小写;

‘n’ 表明允许使用匹配任何字符串的元数据,即’.';

‘m’将x作为一个包含多行的字符串;

下面举例说明regexp_like函数的例子:

select sysdate from dual where regexp_like('i love ','o[[:alpha:]]{5}')

这个例子中,从’i love ’这个字符串中匹配一个模式,这个模式是以o开头,在o后面有5个字符的字符串,这样就匹配到了里面的单词oracle,这样就可以正确的获得系统的当前日志。

 

regexp_instr的原型如下:
regexp_instr(
srcstr,pattern[,start[,occurrence[,return_option[,match_option]]]])
这里每个参数分别含义如下:

srcstr  待匹配的字符串

pattern 待匹配的模式

start   开始匹配的位置,如果不指定默认为1

occurrence  匹配的次数,如果不指定,默认为1

return_option  指定返回值的类型,如果该参数为0,则返回值为匹配位置的第一个字符,如果该值为非0则返回匹配值的最后一个位置。

match_option 可以用这个参数来修改一些默认的配置设置。这个值与前面所说的regexp_like函数中的match_option参数的意义是一样的。

下面来举几个有关regexp_instr函数的例子:
select regexp_instr(
‘i love ’,'o[[:alpha:]]{5}’,1,1) as r from dual
这个例子从’i love ’这个字符串中匹配一个模式,这个模式是以o开头,在o后面有5个字符的字符串。这样自然而然就返回oracle的起始位置12

另一个例子是:
select regexp_instr
(’i love ’,'o[[:alpha:]]{2}’,1,2,1) as r from dual
这个例子的含义是在’i love ’这个字符串中匹配另一个模式,这个模式是以o开始,再包含两个字符的一个模式,因此这个模式可以是ove,也可是ora,但是我们要求它匹配两次,因此这个SQL语句的结果是ora所在的位置,所在的什么位置呢?因为我们的return_option参数的值是1,即大于0,所以这的结果是15,也就单词oracle中a所在的位置。

 

regexp_replace的原型如下:

regexp_replace(srcstr,pattern[,replace_string[,start[,occurence[match_option]]]])
每个参数的意思分别是:

srcstr 待匹配的函数

pattern 正则表达式元字符构成的匹配模式

replace_string 替换字符串

start 开始位置

occurence 匹配次数

match_option 匹配参数,这里的匹配参数和regexp_like是完全一样的,可参考前面的一篇文章。

举例来讲:
select regexp_replace(’hello everybody,may I have your attention please?’,'b[[:alpha:]]{3}’,'one’) from dual

将会返回结果:
hello everyone,may I have your attention please?

 

regexp_replace的原型如下:

regexp_substr(srcstr,pattern[,start[,occurence[match_option]]])
这里各参数的意义与前面的函数regexp_replace的含义是一样的。

regexp_substr的例子如下:
select regexp_substr(’I love oracle very much’,'o[[:alpha:]]{5}’) from dual;

这里将获得匹配结果:oracle,这也是这个函数的返回结果。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9399028/viewspace-711068/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
鱼儿的学习空间

注册时间:2010-11-16

  • 博文量
    433
  • 访问量
    1863699