现代的应用系统的处理要求越来越复杂,比如在搜索字符串时可指定从任意位置开始,搜索到希望的字符串后,可以替换一个或多个等。

✿ 问题的提出

如果用户提出要对字符串进行搜索,且开始搜索的位置是任意的,搜索匹配上的字符串可替换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 '”表示替换成空格。