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

Find pattern and Replace 16 to 20 character after the pattern

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

要求替换ADAC关键字后面的16到20个字符长的帐号

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

使用regexp_replace是否可行?

需要注意的是,这种替换通常可以用 regexp_replace 完成。我将在下面添加一个示例,它使用 space 作为分隔符来查找 ADAC 关键字和后续帐号。 (如果帐号中允许 space,则需要进行调整)

这是此类替换的示例。

创建测试 table:

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            

然后进行更新。
此更新将查找后跟 space 且前面是 space 或行首的任何 ADAC 键,并将以下 16-20 个字符更新为二十个 X 字符。但如果帐号包含超过 20 个字符,则不会执行任何操作。 此更新将有效帐号限制为 [0-9a-zA-Z_],但可以调整以允许其他有效帐户。

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

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_id1和2中的账号被遮挡了。 account_id 3 有两个符合条件的匹配项需要隐藏,而 account_id 4 没有符合条件的帐号。