现代的应用系统的处理要求越来越复杂,比如在搜索字符串时可指定从任意位置开始,搜索到希望的字符串后,可以替换一个或多个等。
✿ 问题的提出
如果用户提出要对字符串进行搜索,且开始搜索的位置是任意的,搜索匹配上的字符串可替换0个或多个,那么,要如何实现呢?
✿ 实现技术
Oracle系统提供的正则表达式REGEXP_REPLACE语句可以实现,REGEXP_REPLACE语法为:
REGEXP_REPLACE(<string>,<pattern>,<replacement> ,<position>,<occurence>,<match_parameter>)
返回匹配上<pattern>
就用<replacement>
替换的<string>
结果。
<position>
是可选参数,默认1,表示搜索的开始位置。
<occurrence>
是可选参数,默认0,表示要匹配的模式,0意思是所有出现将被替换。
<match_parameter>
是可选参数,默认为匹配行为,类似REGEXP_LIKE。
✿ 实现步骤
为了理解正则表达式中的REGEXP_REPLACE,下面的样例由简单到复杂,若希望深入了解,请参看“Oracle® Database SQL Language Reference 12c Release 1 (12.1)E17209-14”。
--
SQL> select ename,sal from emp;
ENAME SAL
-------------------- ----------
SMITH 800
ALLEN 1600
WARD 1250
JONES 2975
MARTIN 1250
--
SQL> col REGEXP_REPLACE for a20
SQL> select REGEXP_REPLACE(ename,'(.)', '\1 ') "REGEXP_REPLACE"
2* from scott.emp ;
REGEXP_REPLACE
--------------------
S M I T H
A L L E N
W A R D
J O N E S
M A R T I N
B L A K E
C L A R K
S C O T T
K I N G
T U R N E R
A D A M S
J A M E S
F O R D
M I L L E R
已选择14 行
SQL> select REGEXP_REPLACE(ename,'(.)', '\1*') "REGEXP_REPLACE"
2* from scott.emp ;
REGEXP_REPLACE
--------------------
S*M*I*T*H*
A*L*L*E*N*
W*A*R*D*
J*O*N*E*S*
M*A*R*T*I*N*
B*L*A*K*E*
C*L*A*R*K*
S*C*O*T*T*
K*I*N*G*
T*U*R*N*E*R*
A*D*A*M*S*
J*A*M*E*S*
F*O*R*D*
M*I*L*L*E*R*
已选择14 行
✿ 说明
这里的“(.)
”表示任何字符(除了NULL)的意思,而“'\1 '
”表示替换成空格。