如何使用REGEXP_SUBSTR提取最后一个字符串?

时间:2015-11-16 17:15:27

标签: oracle unix

我想提取最后一句话。例如

input  - 'SURGICAL INC (SKUMAR) (1058585_BI_SF)'
output - 1058585_BI_SF

input  - 'MEDICAL, ABC(854567_BI_SF)'
output - 854567_BI_SF

如何使用Oracle中的正则表达式实现此目的?

2 个答案:

答案 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        

正则表达式可能比简单的工具更昂贵。