Oracle regex_replace 不排除某些值

Posted

技术标签:

【中文标题】Oracle regex_replace 不排除某些值【英文标题】:Oracle regex_replace is not excluding certain values 【发布时间】:2021-10-04 00:46:48 【问题描述】:

我有一个带有 regex_replace 的 select 语句。

 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 逻辑适用于所有具有 =||||| 的值有效,但对于其他值,它没有选择它们。我希望按原样选择其他值。

【问题讨论】:

看起来罪魁祸首是第一个正则表达式。尝试将=[^=|]+(\||$)替换为=,即REGEXP_REPLACE(nvl(d.text_i, d.text),'=[^=|]+(\||$)', '=') 【参考方案1】:

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

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

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

见this regex demo。

【讨论】:

嗨,但我有一个疑问。 SELECT (REGEXP_REPLACE((REGEXP_REPLACE('22379=C|||||||','=[^=|]+(\||$)','=')),'^'||22379|| '=|\|' ||22379||'=', '|'||22379||'='||'B')) 来自对偶;所以这里有 7x|在 select 语句中的 C 之后,但在输出中只有 6x|。我的输出是 22379=B|||||| .所以有些东西正在删除一个|。 @newintodev 对,如果用(\||$) 捕获的| 必须保留,则使用'=\1' 作为替换。

以上是关于Oracle regex_replace 不排除某些值的主要内容,如果未能解决你的问题,请参考以下文章

解码为希伯来语时不正确的 regex_replace

tp查找某字段,排除某字段,不用一次写那么多

Oracle 完全导出,排除而不使用 par 文件

tp查找某字段,排除某字段,不用一次写那么多

Oracle 查询排除周末和下午 6 点到晚上 9 点

在进行 url 编码时,std::regex_replace 对于字符“+”不能正常工作