Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Использование regexp_substr  [new]
Yuri Kazakoff
Member

Откуда: Североморск
Сообщений: 180
Подскажите, пожалуйста, кто недавно регулярные выражения юзал, как regexp_substr заюзать, чтобы из строки:

ГАЗ 44_В135ТЕ_ОРБ_Ичалковский РЭС


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

Спасибо!
22 ноя 17, 15:52    [20975531]     Ответить | Цитировать Сообщить модератору
 Re: Использование regexp_substr  [new]
instr substr
Guest
select substr('ГАЗ 44_В135ТЕ_ОРБ_Ичалковский РЭС',instr('ГАЗ 44_В135ТЕ_ОРБ_Ичалковский РЭС','_',1,3)+ 1) from dual

И нечего выдумывать сложности на ровном месте
22 ноя 17, 15:57    [20975556]     Ответить | Цитировать Сообщить модератору
 Re: Использование regexp_substr  [new]
Добрый Э - Эх
Guest
Yuri Kazakoff,

В данной постановке задачи достаточно суперпозиции функций substr и instr . Или тут именно спортивный интерес - сделать на регулярках?
22 ноя 17, 15:59    [20975564]     Ответить | Цитировать Сообщить модератору
 Re: Использование regexp_substr  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
A чем тебе SUBSTR/INSTR не угодил? С регуляркой (при условии перед/между _ не пусто):

select regexp_substr('ГАЗ 44_В135ТЕ_ОРБ_Ичалковский РЭС','[^_]+',1,4) from dual


В общем случае:

select regexp_substr('ГАЗ 44_В135ТЕ_ОРБ_Ичалковский РЭС','_([^_]*)',1,3,null,1) from dual


SY.
22 ноя 17, 16:08    [20975593]     Ответить | Цитировать Сообщить модератору
 Re: Использование regexp_substr  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
instr substr
И нечего выдумывать сложности на ровном месте


SQL> select substr('instr substr',instr('instr substr','_',1,3)+ 1) from dual
  2  /

SUBSTR('INST
------------
instr substr

SQL> select substr('instr substr',instr('instr substr' || '___','_',1,3)+ 1) from dual
  2  /

S
-


SQL> 


SY.
22 ноя 17, 16:15    [20975631]     Ответить | Цитировать Сообщить модератору
 Re: Использование regexp_substr  [new]
Elic
Member

Откуда:
Сообщений: 29991
SY
regexp_substr
"после третьего" <> "между третьим и четвёртым"
22 ноя 17, 16:26    [20975676]     Ответить | Цитировать Сообщить модератору
 Re: Использование regexp_substr  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
with t as (
select 'ГАЗ 44_В135ТЕ_ОРБ_Ичалковский РЭС' s from dual
)
select substr(s,instr(s,'_',1,3)+ 1)      var1
      ,regexp_replace(s,'^([^_]*\_){3}')  var2
 from t;
22 ноя 17, 16:43    [20975746]     Ответить | Цитировать Сообщить модератору
 Re: Использование regexp_substr  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
Elic
"после третьего" <> "между третьим и четвёртым"


Упс. Тогда SUBSTR/INSTR. REGEXP_SUBSTR скорее всего в два приема.

SY.
22 ноя 17, 16:55    [20975775]     Ответить | Цитировать Сообщить модератору
 Re: Использование regexp_substr  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
Точно. Через REGEXP_REPLACE, только та же ситуaция что и у instr substr:

with t as (
select 'orawish' s from dual
)
select substr(s,instr(s,'_',1,3)+ 1)      var1
      ,regexp_replace(s,'^([^_]*\_){3}')  var2
      ,regexp_replace(s || '___','^([^_]*\_){3}')  var2
 from t
/

VAR1    VAR2    V
------- ------- -
orawish orawish

SQL> 


SY.
22 ноя 17, 16:59    [20975801]     Ответить | Цитировать Сообщить модератору
 Re: Использование regexp_substr  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18388
SY
Точно.

'_[^_]*_[^_]*_(.*)'
22 ноя 17, 17:26    [20975885]     Ответить | Цитировать Сообщить модератору
 Re: Использование regexp_substr  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2798
SY,
  1  with t as (
  2  select 'o_r_a_w_i_s_h_' s from dual
  3  )
  4  select substr(s,instr(s,'_',1,3)+ 1)      var1
  5        ,regexp_replace(s,'^([^_]*\_){3}')  var2
  6        ,regexp_replace(s || '___','^([^_]*\_){3}')  var2
  7*  from t
SQL> /

VAR1     VAR2     VAR2
-------- -------- -----------
w_i_s_h_ w_i_s_h_ w_i_s_h____


.....
stax
22 ноя 17, 18:00    [20975947]     Ответить | Цитировать Сообщить модератору
 Re: Использование regexp_substr  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18388
Stax

with t as (
 select 'o_r_a_w_i_s_h_' s from dual union all
 select 'orawish' s from dual union all
 select 'or_a_wish' s from dual
 )
 select s, regexp_substr(s,'_[^_]*_[^_]*_(.*)',1,1,null,1)  var2
  from t
22 ноя 17, 18:08    [20975961]     Ответить | Цитировать Сообщить модератору
 Re: Использование regexp_substr  [new]
Yuri Kazakoff
Member

Откуда: Североморск
Сообщений: 180
Всем большое человеческое спасибо!
1 дек 17, 13:28    [20998246]     Ответить | Цитировать Сообщить модератору
 Re: Использование regexp_substr  [new]
Yuri Kazakoff
Member

Откуда: Североморск
Сообщений: 180
Добрый Э - Эх,

Согласен, но регэкспы красивее смотрятся.
1 дек 17, 13:53    [20998330]     Ответить | Цитировать Сообщить модератору
 Re: Использование regexp_substr  [new]
умирает последней
Guest
 substr(s,instr(s,'_',1,3)+ 1)
Для учета менее трех подчеркиваний нужно обернуть instr в nullif.
1 дек 17, 14:06    [20998368]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить