ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle正则表达式(REGEXP_)相关函数

Oracle正则表达式(REGEXP_)相关函数

原创 Linux操作系统 作者:realkid4 时间:2013-08-01 15:04:24 0 删除 编辑

 

我们在进行字符串比对和处理的时候,正则表达式(Regular Expression)是我们经常使用的利器。借助正则表达式的模式匹配功能,可以帮助我们强化一些传统的函数操作功能,来提高我们处理效果。

 

 

Oracle函数中,也提供了若干与正则表达式相关的函数和操作。用好这些函数,可以大大提升我们的处理字符串的能力和水平。Oracle的正则相关函数,主要是以REGEXP_作为前缀进行标识。主要的正则处理函数包括regexp_countregexp_instrregexp_replaceregexp_substr。本篇主要介绍这几种函数的使用格式和应用,供有需要的朋友待查。

 

0、环境说明

 

我们的使用都在Oracle 11gR2上进行。

 

 

SQL> select * from v$version;

 

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

PL/SQL Release 11.2.0.1.0 - Production

CORE        11.2.0.1.0         Production

 

TNS for Linux: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 - Production

 

 

 

1REGEXP_COUNT

 

REGEXP_COUNT是返回正则表达式匹配成功格式的函数。其具体格式为如下:

 

 

从函数名称上,我们也可以猜到regexp_count的基本含义。对一个source_char字符串应用正则模式匹配,返回匹配成功的次数。在语法树结构中,如果需要从特定的position进行匹配,可以添加position参数。

 

此外,通过match_param进行匹配行为的控制。我们先看一个简单的实例。

 

 

SQL> select regexp_count('423423','(42)') from dual;

 

REGEXP_COUNT('423423','(42)')

-----------------------------

                            2

 

 

Oracle的正则表达式是一种兼容性很强的语法体系,一般常用的匹配模式都可以作为匹配字符串进行设置。示例中,使用’(42)’作为匹配条件匹配字符串。在source_char中出现了两次,结果返回2,表示出现两次。

 

这里主要想介绍一下match_param控制参数,Oracle中主要是通过这个参数字符的设置来控制正则匹配的行为。这个参数取值如下:

 

ü  i:表示进行大小写敏感方式匹配过程;

ü  c:表示进行大小写不敏感方式的匹配;

ü  n:在使用(.)匹配任意字符的时候,是否将新行作为匹配的要素。如果不设置,就不进行匹配;

ü  m:是否将source_char作为多行字符串进行匹配。

ü  x:是否忽略source_char中的空格。默认情况下,空格是参与到匹配过程的。

 

注意:match_param只接受一个控制参数值,如果设置多个值,只对最后一个设置的合法值起效果。

 

 

 

SQL> select regexp_count('abCAB','ab') from dual;

 

REGEXP_COUNT('ABCAB','AB')

--------------------------

                         1

 

SQL> select regexp_count('abCAB','ab',1,'i') from dual;

 

REGEXP_COUNT('ABCAB','AB',1,'I

------------------------------

                             2

 

 

加入’n’控制符后,可以对换行符作为字符串进行识别。

 

SQL> select regexp_count('k'||chr(10)||'kl','(.)',1,'n') from dual;

 

REGEXP_COUNT('K'||CHR(10)||'KL

------------------------------

                             4

 

SQL> select regexp_count('k'||chr(10)||'kl','(.)') from dual;

 

REGEXP_COUNT('K'||CHR(10)||'KL

------------------------------

                             3

 

 

 

2REGEXP_INSTR

 

REGEXP_INSTR是基本SQL函数INSTR的一种拓展。Instr函数的作用是返回一个整数,表示一个字符串中第一次出现匹配字符串的位置编号。

 

Instr仅能作为一次的匹配过程,而且匹配子串是一个固定字符串,不支持正则表达式。

 

 

SQL> select instr('23k4','k') from dual;

 

INSTR('23K4','K')

-----------------

                3

 

 

Regexp_instr是对instr的一种正则关系补充,语法结构如下:

 

 

 

参数source_charpattern的用法含义和regexp_count相同。可选参数position依然是表示开始进行匹配的起始位置。

 

 

SQL> select regexp_instr('23k4kwoi','k') from dual;

 

REGEXP_INSTR('23K4KWOI','K')

----------------------------

                           3

 

 

无论是instr还是regexp_instr,都只能返回一个整数取值。参数occurrence表示的是进行第几次匹配。比如正则表达式可以在source_char中匹配多次,occurrence就表示返回第几次匹配的字符串定位。

 

 

SQL> select regexp_instr('23k4kwoikw','k',1,2) from dual;

 

REGEXP_INSTR('23K4KWOIKW','K',

------------------------------

                             5

 

 

使用occurrence,可以定位到指定出现次数的位置。

 

Return_opt也是控制参数信息,用于表示返回位置信息。如果设置为0,表示返回匹配字符串匹配的第一个位置。如果设置为1,表示返回匹配字符串的最后一位。

 

 

SQL> select regexp_instr('23kw4kwoikw','kw',1,2,0) from dual;

 

REGEXP_INSTR('23KW4KWOIKW','KW

------------------------------

                             6

 

SQL> select regexp_instr('23kw4kwoikw','kw',1,2,1) from dual;

 

REGEXP_INSTR('23KW4KWOIKW','KW

------------------------------

                             8

 

 

match_param参数和regexp_count中的match_param参数功能相同。

 

3REGEXP_REPLACE

 

Regexp_replace函数是传统字符串函数replace的一个拓展版。Replace的基本功能是将source_char中指定的字符子串替换为目标的字符子串。

 

 

SQL> select replace('Tom, Ky','Tom','Tim') from dual;

 

REPLACE('TOM,KY','TOM','TIM')

-----------------------------

Tim, Ky

 

 

Replace的使用是很简单的。Regexp_replace对其的拓展在于匹配字符串可以支持正则表达式进行替换。其语法格式如下:

 

 

replace_string而言,可以设置上进行替换的字符串或者正则表达式。其他参数的含义与上面基本类似。下面一个实例可以帮助我们理解:

 

数据表employees中,包括phone_number字符串。

 

 

SQL> select phone_number from hr.employees where rownum<5;

 

PHONE_NUMBER

--------------------

650.507.9833

650.507.9844

515.123.4444

515.123.5555

 

 

如果需要改变格式,可以使用正则表达式来完成。

 

 

SQL> select regexp_replace(phone_number,'([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})','(\1) \2-\3') from hr.employees where rownum<5;

 

REGEXP_REPLACE(PHONE_NUMBER,'(

--------------------------------------------------------------------------------

(650) 507-9833

(650) 507-9844

(515) 123-4444

(515) 123-5555

 

 

注意,如果替换字符串中希望包括匹配内容,可以使用\[1-n]来用于指代。下一个例子是给每一个字符后面添加一个空格。

 

 

SQL> col a for a20;

SQL> select first_name,regexp_replace(first_name,'(.)','\1 ') a from hr.employees where rownum<5;

 

FIRST_NAME           A

-------------------- --------------------

Ellen                E l l e n

Sundar               S u n d a r

Mozhe                M o z h e

David                D a v i d

 

 

4REGEXP_SUBSTR

 

Regexp_substr是字符串处理函数substr的一个拓展。传统的substr作用在于对字符串的截取,截取出一个子串。

 

 

SQL> select substr('Hteml Tes',3) from dual;

 

SUBSTR('HTEMLTES',3)

--------------------

eml Tes

 

 

格式语法如下:

 

 

 

下面例子中演示了如何从第一个空格开始,截取字符串。

 

 

SQL> select regexp_substr('Hteml Tes',' (.)+') from dual;

 

REGEXP_SUBSTR('HTEMLTES','(.)+

------------------------------

 Tes

 

 

5、结论

 

Regexp_前缀系列函数,基本上是对原有的字符串功能进行拓展。在进行字符串处理的时候,正则表达式可以给我们很多帮助。

regexp_count.JPG

regexp_instr.JPG

regexp_replace.JPG

regexp_substr.JPG

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

下一篇: Version Rpt 3.12
请登录后发表评论 登录
全部评论
求道~

注册时间:2010-11-30

  • 博文量
    545
  • 访问量
    7629851