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

https://dbfiddle.uk/?rdbms=oracle_18&fiddle=94771b6589b01526ad0cf0194c4d0cf61e55>

Мне нужна помощь в извлечении подстроки числа из имени файла
в настоящее время для формата файла - 'monkey_eats_mango_everyday_202002.txt' мы делаем так

select regexp_substr('monkey_eats_mango_everyday_202002.txt', '\d+') as parameter12a 
from dual;

результат-

202002

который, в свою очередь, используется в более крупном запросе, чтобы получить последнюю дату этой даты, например

select to_char(last_day(to_date(regexp_substr('monkey_eats_mango_everyday_202002.txt', '\d+'),  'yyyymm')), 'yyyymmdd') as parameter 
from dual ;

результат-

20200229

Сейчас изменился формат файла, так что имеем - 'donkey_eats_pines_cones_20192301_7771234_everyday_202002.txt'

В этом формате файла есть числа в других местах, например 201943_7771234, которые могут быть датами или любыми случайными числами, поэтому мне нужно регулярное выражение, которое может извлечь 202002 из формата файла.

select regexp_substr('donkey_eats_pines_cones_201943_7771234_everyday_202002.txt', '\d+') as parameter12a 
from dual;

person amarender reddy jali    schedule 17.03.2020    source источник


Ответы (3)


Вы можете использовать \., чтобы привязать ваши цифры к точке рядом с точкой в ​​имени файла, а затем использовать группу захвата вокруг цифр, чтобы получить только цифры на выходе, используя 6-й параметр для REGEXP_SUBSTR, чтобы указать, что вам нужна только группа 1 в выходных данных:

SELECT REGEXP_SUBSTR('donkey_eats_pines_cones_201943_7771234_everyday_202002.txt', '(\d+)\.', 1, 1, NULL, 1) AS parameter12a 
FROM dual;

Выход:

202002

Демо на dbfiddle

person Nick    schedule 17.03.2020

Одним из вариантов является использование вложенных выражений: внутреннее возвращает расширение файла и дату (которая предшествует этому расширению), а внешнее извлекает саму дату.

SQL> with test (col) as
  2    (select 'donkey_eats_pines_cones_201943_7771234_everyday_202002.txt' from dual)
  3  select regexp_substr(regexp_substr(col, '\d+.\w+$'), '\d+') result From test
  4  /

RESULT
------
202002

SQL>
person Littlefoot    schedule 17.03.2020

Проверь это

select reverse(split_part(reverse(r.r ), '.', 2)) from 
(
SELECT reverse(split_part(reverse('donkey_eats_pines_cones_20192301_7771234_everyday_202002.txt'), '_', 1)) as r
)as r

ОТВЕТ: 202002

person Shanmugapriya D    schedule 17.03.2020