Oracle 如何使用REGEXP\u SUBSTR提取最后一个字符串?

Oracle 如何使用REGEXP\u SUBSTR提取最后一个字符串?,oracle,unix,Oracle,Unix,我想提取最后一串句子。比如说 input - 'SURGICAL INC (SKUMAR) (1058585_BI_SF)' output - 1058585_BI_SF input - 'MEDICAL, ABC(854567_BI_SF)' output - 854567_BI_SF 如何在Oracle中使用正则表达式来实现这一点?您需要regexp\u substr还是可以使用其他函数 例如:reverse-查找第一个(在reverse之后-substr-reverse selec

我想提取最后一串句子。比如说

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

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

如何在Oracle中使用正则表达式来实现这一点?

您需要
regexp\u substr
还是可以使用其他函数

例如:
reverse
-查找第一个
在reverse之后-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)

如果你想要一个正则表达式,你可以使用
“\([^(]*\)$”
——也就是说,一个(转义的)左括号,任意数量的任何其他字符,一个右括号——和一个$使它只在字符串的末尾匹配。可能有一种更简洁的方法使它成为非贪婪匹配

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\u 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        

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

我使用INSTR和SUBSTR解决了这个问题,但是使用这个表达式会变得很长。我一直在寻找正则表达式。@Alex Poole提供了很好的解决方案如何去掉括号中的输出。所以我的输出应该是-1058585_biu SF和854567_biu SF。
replace(替换(str,),,,,(,)
?能否更具体地说明要提取的目标?目标是否在最后一对括号中?有关输入字符串外观的一些详细信息也会有所帮助。是否始终至少有一对开/闭括号?最后一对闭括号后面是否有任何内容?