Oracle 正则表达式替换为条件

Posted

技术标签:

【中文标题】Oracle 正则表达式替换为条件【英文标题】:Oracle Regex Replace With Condition 【发布时间】:2020-03-23 09:46:25 【问题描述】:

我是使用 RegEx 的新手,如果存在特殊字符,我正在尝试应用 REGEXP_REPLACE 条件,然后应用正则表达式,否则应用其他正则表达式,例如

SELECT REGEXP_REPLACE ('PCB terminal block - FRONT 2,5-V/SA 5/10 BK - 1109601', '([^\-]+$)' , '')  FROM dual;

输出

PCB terminal block - FRONT 2,5-V/SA 5/10 BK -

在最后一个(-)之后删除正则表达式就可以了

但是如果我的字符串不包含 (-) 那么这将返回 null 如下

SELECT REGEXP_REPLACE ('PCB terminal block, nominal current: 4 A, rated voltage (III/2): 250 V, nominal cross section', '([^\-]+$)' , '')  froM dual

输出

null

我想更改此正则表达式以返回不包含 (-) 的字符串是否可能?

【问题讨论】:

【参考方案1】:

问题是你原来的表达方式太宽泛了。它匹配字符串末尾的破折号 (-) 以外的一系列字符:因此,如果字符串不包含破折号,则它完全匹配,并被抑制。

您可以将破折​​号添加到正则表达式中,使其成为匹配的一部分。 REGEXP_REPLACE() 保留不匹配的字符串:

SELECT REGEXP_REPLACE (mycol, '-[^-]+$' , '-')  FROM dual;

Demo on DB Fiddle

with t as (
    select 'PCB terminal block, nominal current: 4 A, rated voltage (III/2): 250 V, nominal cross section' mycol from dual
    union all select 'PCB terminal block - FRONT 2,5-V/SA 5/10 BK - 1109601' from dual
)
select mycol, regexp_replace(mycol,  '-[^-]+$' , '-') from t
麦科尔 | REGEXP_REPLACE(MYCOL,'-[^-]+$','-') :------------------------------------------------ ------------------------------------------------------- | :------------------------------------------------ ------------------------------------------ PCB 接线端子,标称电流:4 A,额定电压 (III/2):250 V,标称横截面 | PCB 接线端子,标称电流:4 A,额定电压 (III/2):250 V,标称横截面 PCB 接线端子 - FRONT 2,5-V/SA 5/10 BK - 1109601 | PCB 接线端子 - FRONT 2,5-V/SA 5/10 BK -

请注意,在字符类中转义破折号不是必需的,也不需要转义。

【讨论】:

【参考方案2】:

您也可以使用替换来做到这一点:

regexp_replace(col,  '(^.*-)[^-]+$' , '\1')

这个想法是确定您想要保留的字符串部分——即括号中的部分。其余部分表示“字符串末尾不是连字符的所有内容”。

这是可行的,因为如果没有匹配项(即没有连字符),则不会发生替换并返回整个字符串。

【讨论】:

以上是关于Oracle 正则表达式替换为条件的主要内容,如果未能解决你的问题,请参考以下文章

oracle 正则表达式

Oracle 正则表达式替换用逗号包围的字符串的多次出现

gawk - 有条件的(即,取决于正则表达式匹配)查找/替换为某些转换器功能

notepad正则怎么替换其中一部分

Oracle:正则表达式替换模式上的多个替换

有没有办法使用正则表达式进行条件替换功能