2015-11-16 3 views
1

Я хочу извлечь последнюю строку предложения. НапримерКак использовать REGEXP_SUBSTR для извлечения последней строки?

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

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

Как это сделать, используя регулярные выражения в Oracle?

+0

Можете ли вы уточнить цель, которую хотите извлечь? Является ли цель какой-либо в последней паре круглых скобок? – kdbanman

+0

Некоторые детали, на которые всегда будут выглядеть входные строки, тоже помогают. Всегда ли будет хотя бы одна пара открытых/закрытых круглых скобок? Будет ли что-нибудь после последней закрывающей скобки? – kdbanman

ответ

1

Вам необходимо regexp_substr или с использованием других функций будет приемлемым?

, например: reverse - найти 1-й ( после обратной - подстроки - обратный

select reverse(
    substr(reverse('SURGICAL INC (SKUMAR) (1058585_BI_SF)') 
,1 
,instr(reverse('SURGICAL INC (SKUMAR) (1058585_BI_SF)'), '(') 
)) from dual 

(1058585_BI_SF) 
+0

Я решаю это с помощью INSTR и SUBSTR, но использование этого выражения становится длительным. Я искал регулярное выражение. – user3124465

+0

@Alex Poole предоставил отличное решение – are

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   

Регулярные выражения могут быть более дорогими, чем простые инструменты, хотя.

+0

Как избавиться от parenthesein Output. поэтому мой вывод должен быть - 1058585_BI_SF и 854567_BI_SF. – user3124465

+1

'replace (replace (str, ')', ''), '(', '')'? – are

Смежные вопросы