oracle (12c) regexp_substr 拆分文件名和目录名

oracle (12c) regexp_substr to split filename and directoryname

使用 Oracle 12c,我想将包含完整文件名(包括目录)的字符串拆分为 2 个字符串:第一个是目录,第二个是文件名。

我已经有了文件名,但无法正确提取目录:

select
   val,
   regexp_substr(val, '[^/]+/[^/]+', 1, 1) as dirname,
   regexp_substr(val, '[^/]+$', 1, 1) as filename
from (select '/a/b/c/d/e/f/file.ext' as val from dual) t

这给出:

dirname = a/b -- This is my purpose...
filename = file.ext -- This is correct !

我想将目录名设为

/a/b/c/d/e/f

包括第一个“/”

注意:我不想分成几行(使用逐句连接)。 我需要用 2 个单独的字符串得到一行...

谢谢...

我们可以尝试使用 REGEXP_SUBSTRREGEXP_REPLACE 如下:

SELECT
    REGEXP_REPLACE(val, '/[^/]*$', '') AS path,
    REGEXP_SUBSTR(val, '[^/]+$') AS filename
FROM yourTable;

这里的基本策略是把最后一个斜杠去掉,然后全部去掉,得到目录路径,反之得到文件名。

您不需要(慢速)正则表达式,只需使用 SUBSTRINSTR:

Oracle 设置:

CREATE TABLE test_data ( val ) AS
  SELECT '/a/b/c/d/e/f/file.ext' FROM DUAL;

查询:

SELECT SUBSTR( val, 1, INSTR( val, '/', -1 ) ) AS dir,
       SUBSTR( val, INSTR( val, '/', -1 ) + 1 ) AS filename
FROM   test_data;

输出:

DIR           | FILENAME
:------------ | :-------
/a/b/c/d/e/f/ | file.ext

db<>fiddle here