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 正则表达式替换为条件的主要内容,如果未能解决你的问题,请参考以下文章