【问题标题】:Oracle REGEXP_REPLACE - Replace multiple occurrences of the pattern with a substringOracle REGEXP_REPLACE - 用子字符串替换多次出现的模式
【发布时间】: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   
  1. 从字符串的开头删除 @DATA:
  2. 去掉字符串末尾的@
  3. 用空格替换:

【问题讨论】:

标签: oracle oracle11g regexp-replace regexp-substr


【解决方案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 只想从开头和结尾删除
  • 感谢您的建议,它适用于给定的模式,但是,当我传递整个字符串时,它没有给出预期的输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-07
  • 2021-12-29
  • 2012-09-25
  • 1970-01-01
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多