Сопоставить содержимое перед необязательной строкой - PullRequest
0 голосов
/ 09 мая 2019

Учитывая следующую строку, я хотел бы произвести: A-2010:

  • /Space/w_00123/A-2010/u_23
  • /Space/w_00123/A-2010 (/ u_23 сверху не является обязательным, поэтому здесь отсутствует)

Так что текст между 3 и 4 / (если присутствует или до конца строки) - это то, что мне действительно нужно.

Я пытался:

select
regexp_substr('/Space/w_00123/A-2010/u_23', '/Space/w_.+/(.*?)(?:/.+|$)', 1, 1, null, 1) r
from dual; -- this results in u_23 as opposed to A-2010

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

Ответы [ 2 ]

2 голосов
/ 09 мая 2019

Использование regexp_substr с 3-м появлением в качестве 4-го аргумента дает то, что вам нужно

with t(str) as
(
 select '/Space/w_00123/A-2010/u_23' from dual union all
 select '/Space/w_00123/A-2010'      from dual
)
select regexp_substr(str,'([^/]+)',1,3) as "Result Strings"
  from t;

Result Strings
--------------
A-2010
A-2010

Демо

1 голос
/ 09 мая 2019

Попробуйте, используя отрицательные классы:

select
regexp_substr('/Space/w_00123/A-2010/u_23', '/Space/w_[^/]+/([^/]+)', 1, 1, null, 1) r
from dual

Онлайн БД Fiddle

...