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 SQL REGEXP_REPLACE - 除指定字符串外的所有内容
Regexp_replace :从 Oracle 中的“+”分隔字符串中删除重复项 [重复]