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

Oracle 函数中,也提供了若干与正则表达式相关的函数和操作。用好这些函数,可以大大提升我们的处理字符串的能力和水平。 Oracle 的正则相关函数,主要是以 REGEXP_ 作为前缀进行标识。主要的正则处理函数包括 regexp_count regexp_instr regexp_replace regexp_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

1 REGEXP_COUNT

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

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

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

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

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

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

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')

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

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

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

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

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

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

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

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

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

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

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

2 REGEXP_INSTR

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

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

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

INSTR('23K4','K')

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

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

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

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

REGEXP_INSTR('23K4KWOIKW','K',

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

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

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

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

REGEXP_INSTR('23KW4KWOIKW','KW

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

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

REGEXP_INSTR('23KW4KWOIKW','KW

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

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

3 REGEXP_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

4 REGEXP_SUBSTR

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

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

SUBSTR('HTEMLTES',3)

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

eml Tes

格式语法如下:

广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员