Как получить имя файла без расширения с помощью регулярных выражений - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть поле со следующими значениями, теперь я хочу извлечь только те строки с "xyz" в значении поля, указанном ниже, не могли бы вы помочь?

        Mydata_xyz_aug21


        Mydata2_zzz_aug22


        Mydata3_xyz_aug33

Еще одно требование

Я хочу извлечь только "aIBM_MyProjectFile" из следующей строки ниже, не могли бы вы помочь мне с этим?

finaldata / mydata / aIBM_MyProjectFile.exe.ld

Я пробовал этоно это не сработало.

select 
regexp_substr('FinalProject/MyProject/aIBM_MyProjectFile.exe.ld','([^/]*)[\.]') exp 
from dual;

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Для первого требования достаточно использовать LIKE, как указано в ответе выше:

SELECT column
  FROM table
 WHERE column LIKE '%xyz%';

Для вашего второго требования (извлечения) вам придется использовать REGEXP_SUBSTR функцию:

SELECT REGEXP_SUBSTR ('FinalProject/MyProject/aIBM_MyProjectFile.exe.ld', '.*/([^.]+)', 1, 1, NULL, 1) 
  FROM DUAL

Надеюсь, это помогло!

0 голосов
/ 14 сентября 2018

Другой способ сделать это - полностью пропустить регулярное выражение:

WITH
    aset AS
        (SELECT 'with_extension.txt' txt FROM DUAL
         UNION ALL
         SELECT 'without_extension' FROM DUAL)
SELECT CASE
           WHEN INSTR (txt, '.', -1) > 0
           THEN
               SUBSTR (txt, 1, INSTR (txt, '.', -1) - 1)
           ELSE
               txt
       END
           txt
  FROM aset

Результатом этого будет

with_extension
without_extension

A BIG Предупреждение, где регулярное выражениелучше:

Мой метод не обрабатывает этот случай правильно:

\ this \ is.a \ test

Так что после того, как я перешел квсе эти усилия, оставайтесь с решениями регулярных выражений.Я оставлю это здесь, чтобы другие могли извлечь из этого уроки.

0 голосов
/ 14 сентября 2018

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

regexp_substr('Mydata_xyz_aug21','_([^_]+)_', 1, 1, NULL, 1)

Чтобы получить имя файла без расширения, вам нужно

regexp_substr('FinalProject/MyProject/aIBM_MyProjectFile.exe.ld','.*/([^.]+)', 1, 1, NULL, 1)

Обратите внимание, что каждое регулярное выражениесодержит группу захвата (шаблон внутри (...)), и к этому значению можно обратиться с последним аргументом 1 к функции regexp_substr.

Шаблон _([^_]+)_ находит первый _, затемпомещает 1 или более символов, отличных от _, в группу 1, а затем сопоставляет другой _.

Шаблон .*/([^.]+) соответствует всему тексту до последнего /, затем захватывает 1 или более символовкроме . в группу 1, используя ([^.]+).

...