我们在进行字符串比对和处理的时候,正则表达式(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)')
-----------------------------
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
2、REGEXP_INSTR
REGEXP_INSTR是基本SQL函数INSTR的一种拓展。Instr函数的作用是返回一个整数,表示一个字符串中第一次出现匹配字符串的位置编号。
Instr仅能作为一次的匹配过程,而且匹配子串是一个固定字符串,不支持正则表达式。
SQL> select instr('23k4','k') from dual;
INSTR('23K4','K')
-----------------
3
Regexp_instr是对instr的一种正则关系补充,语法结构如下:
参数source_char和pattern的用法含义和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参数功能相同。
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
格式语法如下:
下面例子中演示了如何从第一个空格开始,截取字符串。
SQL> select regexp_substr('Hteml Tes',' (.)+') from dual;
REGEXP_SUBSTR('HTEMLTES','(.)+
------------------------------
Tes
5、结论
Regexp_前缀系列函数,基本上是对原有的字符串功能进行拓展。在进行字符串处理的时候,正则表达式可以给我们很多帮助。