`

ORACLE 正则表达式

 
阅读更多
转自:http://fkshl.iteye.com/blog/849914

一.    正则表达式简介:
    正则表达式,就是以某种模式来匹配一类字符串。一旦概括了某类字符串,那么正则表达式即可用于针对字符串的各种相关操作。例如,判断匹配性,进行字符串的重新组合等。正则表达式提供了字符串处理的快捷方式。Oracle 10g及以后的版本中也支持正则表达式.

二.    正则表达式相对通配符的优势:
1.       正则表达式中不仅存在着代表模糊字符的特殊字符,而且存在着量词等修饰字符,使得模式的控制更加灵活和强大。
2.       通配符的使用一般是在特定的环境下,不同的环境下,通配符有可能不同。而正则表达式,不但广泛应用于各种编程语言,而且在各种编程语言中,保持了语法的高度一致性。

三.    元字符:
元字符是指在正则表达式中表示特殊含义的字符。

ORACLE正则表达式
元字符 含义
^ 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 'n' 或 'r'。
. 匹配除换行符 n之外的任何单字符。
? 匹配前面的子表达式零次或一次。
+ 匹配前面的子表达式一次或多次。
* 匹配前面的子表达式零次或多次。
| 指明两项之间的一个选择。例子'^([a-z]+|[0-9]+)$'表示所有小写字母或数字组合成的字符串。
() 标记一个子表达式的开始和结束位置(字符组)。
[] 标记一个中括号表达式。
{m,n} 一个精确地出现次数范围,m=<出现次数<=n,'{m}'表示出现m次,'{m,}'表示至少出现m次。
四.    量词
   量词用来指定量词的前一个字符出现的次数。量词的形式主要有“?”、“*”、“+”、“{}”。量词在用于匹配字符串时,默认遵循贪婪原则。贪婪原则是指,尽可能多地匹配字符。例如:字符串“Function(p),(OK)”,如果使用正则表达式“\(.*\)”进行匹配,则得到字符串“(p),(OK)” ,而非“(p)”;若欲得到“(p)”,则必须取消量词的贪婪原则,此时只需要为量词后追加另外一个数量词“?”即可。如上面的正则表达式应该改为“\(.*?\)”。
五.    字符转义:
    元字符在正则表达式中有特殊含义。如果需要使用其原义,则需要用到字符转义。字符转义使用字符“\”来实现。其语法模式为:“\”+元字符。例如,“\.”表示普通字符“.”;     “\.doc”匹配字符串“.doc”;而普通字符“\”需要使用“\\”来表示。

六.    字符组.
字符组是指将模式中的某些部分作为一个整体。这样,量词可以来修饰字符组,从而提高正则表达式的灵活性。字符组通过()来实现.
许多编程语言中,可以利用“$1”、“$2”等来获取第一个、第二个字符组,即所谓的后向引用。在Oracle中,引用格式为“\1”、“\2”。

七.    正则表达式分支
    可以利用“|”来创建多个正则表达式分支。例如,“\d{4}|\w{4}”可以看做两个正则表达式——“\d{4}”和“\w{4}”,匹配其中任何一个正则表达式的字符串都被认为匹配整个正则表达式。如果该字符串两个正则表达式分支都匹配,那么将被处理为匹配第一个正则表达式分支。

八.    字符类.
在Oracle中,正则表达式的用法与标准用法略有不同。这种不同主要体现在对于字符类的定义上。Orale中不使用字符“\”与普通字符组合的形式来实现字符类,而是具有其特殊语法.
ORACLE字符类
表示 含义
[[:alpha:]] 表示任意字母,正则表达式的一般语法为\w。
[[:digit:]] 表示任意数字,正则表达式的一般语法为\d。
[[:lower:]] 表示任意小写字母。
[[:upper:]] 表示任意大写字母。
[[:alnum:]] 表示任意字母和数字。
[[:space:]] 表示任意空白字符,正则表达式的一般语法为\s。
[[:punct:]] 表示任意标点符号。
[[:xdigit:]] 表示任意16进制的数字,相当于[0-9a-fA-F]。

九.    ORACLE中的四个正则表达式相关函数.
1.       regexp_like(expression, regexp)
   返回值为一个布尔值。如果第一个参数匹配第二个参数所代表的正则表达式,那么将返回真,否则将返回假。
举例:   select * from people where regexp_like(name, '^J.*$');
相当于:  select * from people where name like 'J%';
2.       regexp_instr(expression, regexp, startindex, times)
返回找到的匹配字符串的位置.
参数startindex表示开始进行匹配比较的位置;参数times表示第几次匹配作为最终匹配结果。
举例: select regexp_instr('12.158', '\.') position from dual;
regexp_instr('12.158', '\.')用于获取第一个小数点的位置。
3.       regexp_substr(expression, regexp)
   返回第一个字符串参数中,与第二个正则表达式参数相匹配的子字符串。
   举例: create table html(id integer, html varchar2(2000));
insert into html
values (1, '<a href="http://mail.google.com/2009/1009.html">mail link</a>');
表html中存储了HTML标签及内容。现欲从标签<a>中获得链接的url,那么可以利用regexp_substr()函数。
select id, regexp_substr(html, 'http[a-zA-Z0-9\.:/]*') url from html;
4.  regexp_replace(expression, regexp, replacement)
     将expression中的按regexp匹配到的部分用replacement代替.
     在参数replacement中,可以含有后向引用,以便将正则表达式中的字符组重新捕获。例如,某些国家和地区的日期格式可能为“MM/DD/YYYY”,那么可以利用regexp_replace()函数来转换日期格式。
select regexp_replace('09/29/2008', '^([0-9]{2})/([0-9]{2})/([0-9]{4})$', '\3-\1-\2')  replace
from dual;

注: 在进行正则表达式匹配时,还可以忽略字符大小写形式进行匹配.但是不能解除[[:upper:]]和[[:lower:]]的作用.
select * from people where regexp_like(name, 'or');
select * from people where regexp_like(name, 'or', 'i');   --‘i’表示忽略大小写

十. 正则表达式练习

第一: REGEXP_LIKE函数用法
EMP表结构如下:
SQL> desc emp;
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------

EMPNO                                     NOT NULL NUMBER(4)
ENAME                                              VARCHAR2(10)
JOB                                                VARCHAR2(9)
MGR                                                NUMBER(4)
HIREDATE                                           DATE
SAL                                                NUMBER(7,2)
COMM                                               NUMBER(7,2)
DEPTNO                                             NUMBER(2)
EMP表中部分数据如下:
SQL> select empno,ename,sal,hiredate from emp;

     EMPNO ENAME             SAL HIREDATE
---------- ---------- ---------- --------------
      7369 SMITH             800 17-12月-80
      7499 ALLEN            1600 20-2月 -81
      7521 WARD             1250 22-2月 -81
      7566 JONES            2975 02-4月 -81

下面给出几种REGEXP_LIKE函数的例子
1、查找员工编号为4位数字的员工信息
SQL> select empno,ename from emp where regexp_like(empno,'^[[:digit:]]{4}$');
或者: select empno,ename from emp where regexp_like(empno,'^[0-9]{4}$');
     EMPNO ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
2、查找员工姓名为全英文的员工信息
SQL>  select empno,ename from emp where regexp_like(ename,'^[[:alpha:]]+$');
或者:  select * from emp where regexp_like(ename,'^[a-zA-Z]+$');
     EMPNO ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN
3、查找员工姓名以“a”字母开头,不区分大小写
SQL> select empno,ename from emp where regexp_like(ename,'^a','i');

     EMPNO ENAME
---------- ----------
      7499 ALLEN
      7876 ADAMS
4、查找员工姓名为全英文,且以“N”结尾的员工信息
SQL> select empno,ename from emp where regexp_like(ename,'^[[:alpha:]]+N$');

     EMPNO ENAME
---------- ----------
      7499 ALLEN
      7654 MARTIN
5、查找员工编号以非数字开头的员工信息
SQL> select empno,ename from emp where regexp_like(empno,'[^[:digit:]]');

no rows selected

第二: REGEXP_INSTR函数用法
1、查找员工编号中第一个非数字字符的位置
SQL> select regexp_instr(empno,'[^[:digit:]]') position from emp;

POSITION
----------
         0
         0
         0
2、从第三个字符开始,查找员工编号中第二个非数字字符的位置
SQL> select regexp_instr(empno,'[^[:digit:]]',3,2) position from emp;

POSITION
----------
         0
         0


第三: REGEXP_SUBSTR函数用法
1、返回从ename的第二个位置开始查找,并且是以“L”开头到结尾的字串
SQL> select regexp_substr(ename,'L.*','2') substr from emp;

SUBSTR
------------------
LLEN
LAKE
LARK


第四:REGEXP_REPLACE函数用法
1、把ename中所有非字母字符替换为“A”
SQL> update emp set ename=regexp_replace(ename, '[^[:alpha:]]', 'A')
2 where regexp_like(ename, '[^[:alpha:]]');

1 row updated
分享到:
评论
1 楼 步青龙 2011-12-08  
大哥把Oracle 练到如此地步,小弟佩服啊

相关推荐

    Oracle正则表达式详解(用法+实例)

    ### Oracle正则表达式详解(用法+实例) #### 一、正则表达式简介 正则表达式是一种用于匹配字符串中字符组合的工具。它由一个或多个字符及特殊的字符元组成,能够帮助我们执行复杂的字符串搜索和替换任务。在...

    Oracle正则表达式函数全面解析

    ### Oracle正则表达式函数全面解析 #### 一、引言 在数据库处理文本数据时,经常需要用到模式匹配。Oracle数据库提供了丰富的正则表达式函数,这些函数可以帮助开发者更高效地进行文本匹配、搜索和替换等操作。本文...

    oracle正则表达式

    Oracle正则表达式还支持更高级的功能,如预定义字符类(如`\d`代表数字,`\w`代表单词字符),分组捕获(使用圆括号`()`定义),非贪婪匹配(使用`?`使量词变为非贪婪),以及反向引用(`\number`引用前面分组的内容...

    ORACLE正则表达式

    ORACLE 正则表达式 ORACLE 正则表达式是 Oracle 10g 中引入的一种功能强大的字符串匹配模式。它允许用户使用正则表达式来匹配字符串,从而实现复杂的字符串匹配和提取操作。 正则表达式的基本概念 ---------------...

    Oracle正则表达式参考手册

    Oracle正则表达式参考手册 ,《Oracle Regular Expressions Pocket Reference 》 Oracle Regular Expressions Pocket Reference is part tutorial and part quick-reference.

    Oracle 正则表达式参考手册

    Oracle 正则表达式参考手册 regexp_instr regexp_substr regexp_repalce regexp_like

    Oracle正则表达式参考手册.rar

    chm格式的Oracle正则表达式参考手册,英文版的,不过英文不是很难! ......解压密码 www.infoxa.com

    Oracle中的正则表达式

    "Oracle中的正则表达式" Oracle中的正则表达式是指在Oracle数据库管理系统中使用的正则表达式语言。正则表达式是一种强大的字符串模式匹配语言,可以用来在字符串中搜索、验证、提取和替换文本。Oracle中的正则...

    Oracle数据库正则表达式

    Oracle 数据库正则表达式应用详解 在 Oracle 数据库中,正则表达式是一种强大的模式匹配工具,可以帮助用户快速搜索、替换和验证数据。从 Oracle 10g 开始,Oracle 内建了符合 IEEE POSIX (Portable Operating ...

    oracle 正则表达式

    oracle 正则表达式,主要是正则表达式的主要函数和一些匹配字符的说明

    Oracle正则表达式

    ### Oracle正则表达式 #### 一、简介 在Oracle 10g版本开始,数据库引入了对正则表达式的支持。正则表达式是一种强大的工具,用于模式匹配和文本处理,可以用来搜索、替换、提取等操作。通过正则表达式,用户可以...

    Oracle正则表达式函数

    Oracle数据库系统提供了...对于初学者来说,阅读《美河学习在线eimhe.com_Oracle正则表达式函数.pdf》和《美河学习在线eimhe.com_Oracle正则表达式.pdf》这两份资料,将有助于深入理解和掌握Oracle中的正则表达式功能。

    Oracle正则表达式.pdf

    Oracle 正则表达式 Oracle 正则表达式是 Oracle 数据库从 10g 版本开始支持的功能,它允许用户使用正则表达式来搜索和匹配字符串。Oracle 正则表达式支持 POSIX 风格和 PERL 风格两种风格的运算符。 POSIX 风格...

    oracle正则表达式.ppt

    Oracle正则表达式是Oracle 10g及后续版本引入的一种强大的文本处理工具,它极大地增强了SQL查询的灵活性。在Oracle数据库中,正则表达式主要用于处理字符串数据,包括匹配、替换、查找和提取字符串中的特定模式。...

    Oracle通过正则表达式分割字符串 REGEXP_SUBSTR的代码详解

    position :起始位置,从第几个字符开始正则表达式匹配(默认为1) occurrence :标识第几个匹配组,默认为1 modifier :模式(‘i’不区分大小写进行检索;’c’区分大小写进行检索。默认为’c’) SELECT REGEXP_...

Global site tag (gtag.js) - Google Analytics