Oracle REGEXP_REPLACE - 用子字符串替换多次出现的模式

Posted

技术标签:

【中文标题】Oracle REGEXP_REPLACE - 用子字符串替换多次出现的模式【英文标题】:Oracle REGEXP_REPLACE - Replace multiple occurrences of the pattern with a substring 【发布时间】:2017-02-26 09:11:55 【问题描述】:

是否可以使用 Oracle 中的 REGEXP_REPLACE 函数将多次出现的模式替换为子字符串。我尝试了正则表达式的多重排列和组合,但不知何故它没有正确工作。从表面上看,它看起来可行,但不是很确定.. 任何想法或尝试的指针。下面的示例输入/输出

INPUT_STRING =  SELECT @DATA:T.ID:ID@, @DATA:T.NAME:NAME@, @DATA:T.ADDRESS:ADDRESS@, @DATA:T.CREATED_DATE:CREATED_DATE@ FROM TABLE_NAME T
OUTPUT_STRING = SELECT T.ID ID, T.NAME NAME, T.ADDRESS ADDRESS FROM TABLE_NAME T

本质上,我们需要在固定模式下实现

@DATA:xx.yy:zz@, where xx is table, yy is column name, zz column alias   
    从字符串的开头删除 @DATA: 去掉字符串末尾的@ 用空格替换:

【问题讨论】:

***.com/questions/48924687/… 【参考方案1】:

我想你想要类似的东西

select regexp_replace(txt,'@DATA:(\w+\.(\w+)):(\2)@', '\1 \2' ) from ( 
   select 'SELECT @DATA:T.ID:ID@, @DATA:T.NAME:NAME@, @DATA:T.ADDRESS:ADDRESS@, @DATA:T.CREATED_DATE:CREATED_DATE@ FROM TABLE_NAME T' as txt 
   from dual);

【讨论】:

谢谢,它成功了。我在子表达式中挣扎。我尝试了很多组合..但就是这样,我错过了:) 另外,我尝试了另一种模式 - @DATA:(.+?):(.+?)@。这有什么影响吗? 嗯,这取决于你所说的影响。你指定好的模式“。+?” - 将尝试找到长度最短的“字符串”,您可以使用它。使用相同的查询regexp_replace(txt,'@DATA:(.+?):(.+?)@', '\1 \2' )【参考方案2】:

类似这样的:

 replace(regexp_replace(str, '^@DATA:|@$'), ':', ' ') 

测试:

select str, replace(regexp_replace(str, '^@DATA:|@$'), ':', ' ') 
from ( select '@DATA:xx.yy:zz@' as str from dual);

【讨论】:

^ - 是字符串的开头 $ - 是结尾。如果它在中间,它将不起作用 正确,但 OP 只想从开头和结尾删除 感谢您的建议,它适用于给定的模式,但是,当我传递整个字符串时,它没有给出预期的输出。

以上是关于Oracle REGEXP_REPLACE - 用子字符串替换多次出现的模式的主要内容,如果未能解决你的问题,请参考以下文章

关于 Regexp_replace - Oracle SQL

Oracle Regexp_replace 多次出现

Oracle SQL REGEXP_REPLACE - 除指定字符串外的所有内容

Regexp_replace :从 Oracle 中的“+”分隔字符串中删除重复项 [重复]

将 Oracle Regexp_replace 函数转换为 Netezza

oracle 的 regexp_replace 替换 https 不起作用