我想提取最后一句话。例如
input - 'SURGICAL INC (SKUMAR) (1058585_BI_SF)'
output - 1058585_BI_SF
input - 'MEDICAL, ABC(854567_BI_SF)'
output - 854567_BI_SF
如何使用Oracle中的正则表达式实现此目的?
答案 0 :(得分:1)
您需要regexp_substr
还是使用其他功能?
例如:reverse
- 在反向 - 反向 - 反向后找到第一个(
select reverse(
substr(reverse('SURGICAL INC (SKUMAR) (1058585_BI_SF)')
,1
,instr(reverse('SURGICAL INC (SKUMAR) (1058585_BI_SF)'), '(')
)) from dual
(1058585_BI_SF)
答案 1 :(得分:1)
如果你想要一个正则表达式,你可以使用'\([^(]*\)$'
- 即一个(转义的)左括号,任意数量的任何其他字符,一个右括号 - 和一个$,使它只在最后匹配的字符串。这可能是一种更简洁的方式,使其成为一种非贪婪的比赛。
with t(input) as (
select 'SURGICAL INC (SKUMAR) (1058585_BI_SF)' from dual
union all select 'MEDICAL, ABC(854567_BI_SF)' from dual
)
select input, regexp_substr(input, '\([^(]*\)$') as output
from t;
INPUT OUTPUT
------------------------------------- -------------------------------------
SURGICAL INC (SKUMAR) (1058585_BI_SF) (1058585_BI_SF)
MEDICAL, ABC(854567_BI_SF) (854567_BI_SF)
如果你不想要那些,你只需要从该值中删除括号。您可以使用嵌套的replace
调用,但如果您决定坚持使用正则表达式,则可以使用regexp_replace()
一次性删除这两个调用:
with t(input) as (
select 'SURGICAL INC (SKUMAR) (1058585_BI_SF)' from dual
union all select 'MEDICAL, ABC(854567_BI_SF)' from dual
)
select input,
regexp_replace(regexp_substr(input, '\([^(]*\)$'), '[()]', null) as output
from t;
INPUT OUTPUT
------------------------------------- --------------------
SURGICAL INC (SKUMAR) (1058585_BI_SF) 1058585_BI_SF
MEDICAL, ABC(854567_BI_SF) 854567_BI_SF
正则表达式可能比简单的工具更昂贵。