在模式后找到模式并替换16到20个字符

时间:2017-05-22 16:28:55

标签: oracle regexp-replace

我们在oracle数据库中有一个表,CLOB列中的数据部分需要替换。

要求是替换16到20个字符长的帐号,它总是出现在ADAC关键字之后

输入字符串='ADAC 1345HFT5678MK 345WE' 预期输出='ADAC XXXXXXXXXXXXXXXXXXX'

是否可以使用regexp_replace?

1 个答案:

答案 0 :(得分:0)

有一些警告,通常可以使用regexp_replace进行此类替换。我将在下面添加一个示例,该示例使用空格作为分隔符来查找ADAC关键字和以下帐号。 (如果帐号中允许使用空格,则需要进行调整)

以下是此类替代的一个例子。

创建测试表:

CREATE TABLE ACCOUNT_REPLACEMENT(
  ACCOUNT_ID NUMBER,
  ACCOUNT_DATA CLOB
);

一些测试数据:

INSERT INTO ACCOUNT_REPLACEMENT VALUES (1,'#_# ADAC 1345HFT5678MK_345WE 359e,ne');
INSERT INTO ACCOUNT_REPLACEMENT VALUES (2,'143cN ADAC 1345HFT5678MK_345WE Wookie');
INSERT INTO ACCOUNT_REPLACEMENT VALUES (3,'ADAC 1234567890123456 ADACADAC ADAC abcdefghijklmnopqrst');
INSERT INTO ACCOUNT_REPLACEMENT VALUES (4,'ADAC abcdefghijklmnopqrstuvxyz');

初始状态:

SELECT * FROM ACCOUNT_REPLACEMENT ORDER BY 1 ASC;

ACCOUNT_ID  ACCOUNT_DATA                                              
1           #_# ADAC 1345HFT5678MK_345WE 359e,ne                      
2           143cN ADAC 1345HFT5678MK_345WE Wookie                     
3           ADAC 1234567890123456 ADACADAC ADAC abcdefghijklmnopqrst  
4           ADAC abcdefghijklmnopqrstuvxyz            

然后进行更新 此更新将找到任何ADAC密钥,后跟空格,前面有空格或行开头,并使用20个X字符更新以下16-20个字符。但如果帐号包含超过20个字符,则不会采取任何操作。 此更新将有效帐号限制为[0-9a-zA-Z_],但可以调整为允许其他有效帐号。

UPDATE ACCOUNT_REPLACEMENT
SET ACCOUNT_DATA = REGEXP_REPLACE(ACCOUNT_DATA,
                                  '(^| )(ADAC )([0-9a-zA-Z_]{16,20})( |$)',
                                  '\1\2XXXXXXXXXXXXXXXXXXXX\4');

4 rows updated.

然后检查结果:

SELECT * FROM ACCOUNT_REPLACEMENT
ORDER BY 1 ASC;

ACCOUNT_ID  ACCOUNT_DATA                                                  
1           #_# ADAC XXXXXXXXXXXXXXXXXXXX 359e,ne                         
2           143cN ADAC XXXXXXXXXXXXXXXXXXXX Wookie                        
3           ADAC XXXXXXXXXXXXXXXXXXXX ADACADAC ADAC XXXXXXXXXXXXXXXXXXXX  
4           ADAC abcdefghijklmnopqrstuvxyz           

此处account_id 1和2中的帐号被隐藏。 account_id 3有两个符合条件的符合条件的匹配,而account_id 4则没有符合条件的帐号。