内容提要
oracle 10g 增加的正则表达式函数有以下四种:
regexp_like() --返回满足条件的字段
regexp_instr() --返回满足条件的字符或字符串的位置
regexp_replace() --返回替换后的字符串
regexp_substr() --返回满足条件的字符或字符串
这四个函数的功能分别对应传统sql的 like操作符 和 instr 、replace 、substr函数,
在一般的、不怎么复杂的模式匹配中,使用传统的sql函数就能满足,当需要实现的操作
比较复杂时,使用正则表达式函数,就可以写出简洁、强大的sql语句。
匹配过程中可能会涉及到的元字符(Meta Character)对应的sql代码:
^ 使表达式定位至一行的开头
$ 使表达式定位至一行的末尾
* 匹配0次或更多次
? 匹配0次或1次
+ 匹配1次或更多次
{m} 正好匹配m次
{m,} 至少匹配m次
{m,n} 至少匹配m次但不超过n次
[:alpha:] 字母字符,匹配字符A-Z、a-z
[:lower:] 小写字母字符,匹配字符a-z
[:upper:] 大写字母字符,匹配字符A-Z
[:digit:] 数字,匹配数字0-9
[:alphanum:] 字母数字字符,匹配字符A-Z、a-z、0-9
[:space:] 空白字符(禁止打印),如回车、换行符、竖直制表符和换页符[:punct:] 标点字符
[:cntrl:] 控制字符(禁止打印)
[:print:] 可打印字符|分隔替换选项,通常与分组符()一期使用
() 将子表达式分组为一个替换单元,量词单元或后向引用单元
[char] 字符列表
. 匹配除null之外的任意单个字符
/ 要匹配的字符是一个特殊字符、常量或者后者引用
x|y 匹配 x 或 y
[abc] 匹配abc中的任何单个字符
[a-z] 匹配 a 到 z 范围内的任意单个字符

以下为测试用例:
/*创建测试表==================================================================================*/
create table person
(
first_name varchar2(20),
last_name varchar2(20),
email varchar2(100),
zip varchar(6)
);
insert into person values('Steven','Chen','steven@hp.com','123456');
insert into person values('James','Li','jamesli@sum.com'||chr(10)||'lijames@oracle.com','1b3d5f');
insert into person values('Tina','Zhang','chillaxzx@163.com','2456hd');
insert into person values('Tom','Feng','Tomfeng@126.com','a654e5');
insert into person values('Jonson','zhao','Jonson@google.com','edjksk');
insert into person values('Vines','Wu','Vines@162.com','2djks4');
commit;
select * from person;

/*regexp_like()=================================================================================
regexp_like(search_string ,pattern[,match_option]);
参数说明:
search_string是搜索值
pattern 正则表达式元字符构成的匹配模式,长度限制在512字节内
match_option是一个文本串,允许用户设置该函数的匹配行为。可以使用的选项有:
c 匹配时,大小写敏感,默认值
i 匹配时,大小写不敏感
n 允许使用原点(.)匹配任何新增字符
m 允许将源字符作为多个字符串对待
===============================================================================================*/
--zip字段以数字开始
select * from person where regexp_like(zip,'^[[:digit:]]');
--注意区别
select * from person where regexp_like(zip,'[^[:digit:]]'); --包含非数字
select * from person where regexp_like(zip,'[[:digit:]]'); --包含数字
--zip字段以数字结尾
select * from person where regexp_like(zip,'[[:digit:]]$');
--first_name字段以S开始,N结束的,不区分大小写
select * from person where regexp_like(first_name,'^s.*N$','i'); --注意这里的'i'不能是‘I’,否则报错
--email字段,注意区别
select email from person where regexp_like(email, '^james.*com$');
select email from person where regexp_like(email, '^james.*com$', 'n');
select email from person where regexp_like(email, '^james.*com$', 'm');
select email from person where regexp_like(email, '^li.*com$');
select email from person where regexp_like(email, '^li.*com$', 'm');
select email from person where regexp_like(email, '^li.*com$', 'n');

/*regexp_instr()===================================================================================
regexp_instr(x,pattern[,start[,occurrence[,return_option[,match_option]]]])
参数说明:
x 待匹配的字符串
pattern 正则表达式元字符构成的匹配模式
start 开始匹配位置,如果不指定默认为1
occurrence 匹配的次数,如果不指定,默认为1
return_option 指定返回的类型,若该参数为0,则返回值为匹配位置的第一个字符,若为非0,则返回匹配值的最后一个位置+1
match_option 意义同regexp_like的一样
=================================================================================================*/
--查找zip中第一个非数字字符的位置
select a.*, regexp_instr(zip,'[^[:digit:]]') as position from person a ;
--查找zip中,从第2位开始第2次匹配的最后一个字符位置+1
select a.*, regexp_instr(zip,'[^[:digit:]]',2,2,1) as position from person a ;
--查找zip中,从第1位开始第2次匹配的最后一个字符位置+1
select a.*, regexp_instr(zip,'[^[:digit:]]',1,2,1) as position from person a ;
--查找zip中,从第1位开始第1次匹配的最后一个字符位置+1
select a.*, regexp_instr(zip,'[^[:digit:]]',1,1,1) as position from person a ;
--返回21,从第1个字符开始,找出以o开头 以e结尾 中间跟4个任意字母的单词 第1次匹配的第1个字符位置,这里是oracle中o的位置
select regexp_instr('i love http://www.52oracle.com','o[[:alpha:]]{4}e',1,1) as r from dual
--返回24,从第1个字符开始,找出以o开头 后跟2个任意字母的单词 第2次匹配的第1个字符位置,这里是ora中o的位置
select regexp_instr('i love http://www.52oracle.com','o[[:alpha:]]{2}',1,2,1) as r from dual
--返回17,从第1个字符开始,找出l开头的 后跟4个任意字母的单词 第1次匹配的第1个字符的位置,这里是light中l的位置
SELECT REGEXP_INSTR('But, soft! What light through yonder window breaks?','l[[:alpha:]]{4}',1,1,0) FROM DUAL;
--返回22,从第1个字符开始,找出l开头的 后跟4个任意字母的单词 第1次匹配的最后一个字符的位置+1,这里是light中t的位置+1
SELECT REGEXP_INSTR('But, soft! What light through yonder window breaks?','l[[:alpha:]]{4}',1,1,1) FROM DUAL;

/*regexp_substr()===================================================================================
regexp_substr(x,pattern[,start[,occurrence[match_option]]])
参数说明:
x 待匹配的字符串
pattern 正则表达式元字符构成的匹配模式
start 开始匹配位置,如果不指定默认为1
occurrence 匹配的次数,如果不指定,默认为1
match_option 意义同regexp_like的一样
=================================================================================================*/
--查找第一个非0字符值
select a.* , regexp_substr(zip, '[^[:digit:]]') as zip from person a ;
--从第三个字符开始,查找第2个非0字符值
select a.* , regexp_substr(zip, '[^[:digit:]]', 3, 2) as zip from person a;
--查找以o开始的,后面接4个字母的字符串
select regexp_substr('I love oracle very much','o[[:alpha:]]{4}') from dual;
--查找以o开始的,后面至少接4个字母的字符串
select regexp_substr('I love oracle very much','o[[:alpha:]]{4,}') from dual;
--查找以o开始,以e结尾的,后面接1个或多个除null之外字符的字符串
select regexp_substr('i love oracle very much','o.{1}e',1,1) from dual;
select regexp_substr('i love oracle very much','o.*e',5,1) from dual;

/*regexp_replace()===================================================================================
regexp_replace(x,pattern[,replace_string[,start[,occurrence[match_option]]]])
参数说明:
x 待匹配的字符串
pattern 正则表达式元字符构成的匹配模式
replace_string 替换字符串
start 开始匹配位置,如果不指定默认为1
occurrence 匹配的次数,如果不指定,默认为1
match_option 意义同regexp_like的一样
=================================================================================================*/
--把zip中所有非数字字符替换为0
update person set zip=regexp_replace(zip, '[^[:digit:]]', '0')where regexp_like(zip, '[^[:digit:]]');
select zip from person;
--后向引用:
--后向引用是 一个很有用的特性。它能够把子表达式的匹配部分保存在临时缓冲区中,供以后重用 。缓冲区从左至右进行编号,
--并利用 \digit 符号进行访问。子表达式用一组圆括号来显示。利用后向引用可以实现较复杂的替换功能。
select regexp_replace('Steven Chen', '(.*) (.*)', '\2, \1') as reversed_name from dual;
--修改person表,增加检查zip的第一个字符是否为数字的检查索引
alter table person add constraint constraint_zip check (regexp_like(zip, '^[[:digit:]]+$'));
--根据姓的第一个大写字母创建索引
create index person_idx on person(regexp_substr(last_name, '^[[:upper:]]'));
select *
from person a
where regexp_substr(last_name, '^[[:upper:]]')='W'
-- 用‘XXX’代替‘light’ , 返回But, soft! What XXX through yonder window breaks?
SELECT REGEXP_REPLACE('But, soft! What light through yonder window breaks?','l[[:alpha:]]{4}','XXX') FROM DUAL;
--用’XXX‘代替以e开始,长度为3的字符串,从第5个字符开始,匹配2次
select regexp_replace('hello everybody,may I have your attention please?','e[[:alpha:]]{2}','XXX',5,2) from dual;
--大小写敏感
select regexp_replace('hello Everybody,may I have your attention please?','e[[:alpha:]]{2}','XXX',5,1) from dual;
--忽略大小写
select regexp_replace('hello Everybody,may I have your attention please?','e[[:alpha:]]{2}','XXX',5,2,'i') from dual;

Oracle 支持正则表达式的函数的更多相关文章

  1. ORACLE中的支持正则表达式的函数

    ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBS ...

  2. Oracle中REGEXP_SUBSTR及其它支持正则表达式的内置函数小结

    Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下:在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20','23'的集合. REGEXP_SUBSTR函数格 ...

  3. oracle 10g正则表达式 REGEXP_LIKE 用法

    ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBS ...

  4. Oracle中正则表达式的使用

    Oracle10开始支持正则表达式. ORACLE中的支持正则表达式的函数主要有下面四个: 1. REGEXP_LIKE :          与LIKE的功能相似 2. REGEXP_INSTR : ...

  5. 2015.3.20 Oracle使用正则表达式

    .Oracle正则表达式使用介绍 正则表达式具有强大.便捷.高效的文本处理功能.能够添加.删除.分析.叠加.插入和修整各种类型的文本和数据.Oracle从10g开始支持正则表达式 ..下面通过一些例子 ...

  6. oracle的正则表达式

    阅读目录 1.oracle(regular expression)简单介绍 2.oracle正则特殊字符 3.oracle正则字符簇 4.各种操作符的运算优先级 5.模拟测试例子 6.oracle对应 ...

  7. oracle中的trim()函数详解

    1.先看一下Oracle TRIM函数的完整语法描述 TRIM([ { { LEADING | TRAILING | BOTH }[ trim_character ]| trim_character} ...

  8. Oracle数据库之六 单行函数

    六.单行函数 6.1.认识单行函数 ​ 函数就是和 Java 语言之中的方法的功能是一样的,都是为了完成某些特定操作的功能支持,而在 Oracle 数据库里面也包含了大量的单行函数,这些函数掌握了以后 ...

  9. PHP中有关正则表达式的函数集锦

    之前学正则表达式的目的是想从网上抓取点小说啊,文档啊,还有获取相应的视频连接然后批量下载.当时初学PHP根本不知道PHP有专门抓包的工具,就像Simple_html_dom.php(在我的其他博文中有 ...

随机推荐

  1. [转] 3个学习Socket编程的简单例子:TCP Server/Client, Select

    以前都是采用ACE的编写网络应用,最近由于工作需要,需要直接只用socket接口编写CS的代码,重新学习这方面的知识,给出自己所用到的3个简单例子,都是拷贝别人的程序.如果你能完全理解这3个例子,估计 ...

  2. 解决DatePicker中Appbar icon缺失

    最近写了个小程序,用到了Microsoft.Phone.Controls.Toolkit里的DatePicker控件,引入以后发现AppBar里两个button的图标不显示.如下图: 们是“完成”和“ ...

  3. echarts在360中以及IE8浏览器不兼容:解决方案

    参考:http://blog.csdn.net/www3300300/article/details/12992489 添加: <head> <meta http-equiv=&qu ...

  4. oracle疑难杂症问题

    在虚拟机中安装了oracle10g,由于虚拟机的空间有限,看到磁盘空间快没了,就手贱把oracle目录中的空文件夹(E:\oracle\product\10.2.0\flash_recovery_ar ...

  5. PM 时钟机制

    PM 时钟机制 10.1 Minix3 PM 时钟机制概述在 MINIX3 中,除了前面所讲到的 CLOCK 时钟,在 pm 中也是维持了一个时钟, 我们暂且不分析为啥要这么做,我就分析是怎么实现这个 ...

  6. Core Data入门

    简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象. ...

  7. linux服务器并发与tcmalloc

    前一天使用pmap查看服务器中自己开发的游戏服务的内存使用情况,发现其中数据存储服务的内存占用率非常高,截图如下. 从截图中可以看出来,分配了大量的64MB左右的内存空间,因为对自己的服务比较了解,知 ...

  8. soapdenovo

    配置文件中的=号两边不能有空格,否则会报错 SOAPdenovo-63mer_v2.0 all -s TongJiN2.config -p 25 -K 63 -d 1 -R  -F -o Lily_2 ...

  9. 编程工具系列之一------使用GDB的堆栈跟踪功能

    在调试程序的过程中,查看程序的函数调用堆栈是一项最基本的任务,几乎所有的图形调试器都支持这项特性. GDB调试器当然也支持这一特性,但是功能更加灵活和丰富. GDB将当前函数的栈帧编号为0,为外层函数 ...

  10. windows Batch 脚本的一些常用有效

    也是非常的有用的.比如要想要删除目录下的同一文件名的东西. del /S filename 就可以连同子目录下的同文件名一起删除 . 再比如你想要COPY 文件到子目录下的时候. for /D %%i ...