首页 > 解决方案 > Oracle regex_replace 不排除某些值

问题描述

我有一个带有 regex_replace 的选择语句。

 SELECT REGEXP_REPLACE((REGEXP_REPLACE(nvl(d.text_i, d.text),'[^=|]+(\||$)')),'^'||24466||'=|\|'
                                    ||24466||'=', '||'||24466||'='||'C1')  
  FROM table_infor d
   where d.tab_id = 13095;

列 text_i 和 text 的 I 值如下

text                                            text_i
26736=A||||24470=B1||||24467=||||24466=V1       (null)
26736,24470,24467,24466                         (null)
26736=A||||24470=||||24467=||||24466=V1         (null)
26736=||||24470=B1||||24467=B||||24466=V1       (null)
(null)                                           A
123                                             (null)

所以我想打印这个:

26736=||||||24470=||||||24467=|||||||24466=C1
2673,24470,24467,24466
26736=||||24470=||||24467=||||24466=C1        
26736=||||24470=||||24467=||||24466=C1 
A
123 
  

但我目前得到的是

26736=||||||24470=||||||24467=|||||||24466=C1
(null)
26736=||||24470=||||24467=||||24466=C1        
26736=||||24470=||||24467=||||24466=C1  

所以我的 regexp_replace 逻辑适用于所有具有 =||||| 的值 有效,但对于其他值,它没有选择它们。我希望按原样选择其他值。

标签: regexselectplsqloracle12cregexp-replace

解决方案


'[^=|]+(\||$)'模式匹配除 a 之外的任何一个或多个字符=|直到字符串的 a|或结尾,如果存在则使用管道。这意味着,比赛将尽快开始。您希望仅在出现=符号时才开始匹配。

因此,将其包含在第一个正则表达式中并替换为=以将其放回:

REGEXP_REPLACE(nvl(d.text_i, d.text),'=[^=|]+(\||$)', '=')

请参阅此正则表达式演示


推荐阅读