我们在进行字符串比对和处理的时候,正则表达式(
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号 中国互联网协会会员