我在 PostgreSQL 表中有一系列文件路径,我希望获得没有扩展名的文件名。显示了一些示例数据(另请参阅此处的小提琴)-
VALUES
(1, '/users/mcm1/ualaoip2/vmm/file1.pdf'),
(2, '/users/mcm1/ualaoip2/vmm/file2.py'),
(3, '/users/mcm1/ualaoip2/vmm/file3.pdf'),
(8, '/users/mcm1/ualaoip2/vmm/file8.tar.gz'),
(9, '/users/mcm1/my_prog.cpp');
想要的结果——
file1
file2
file2
file8.tar
my_prog
现在,我一直在尝试掌握正则表达式(我是新手)并且取得了一些进展。这是我到目前为止的代码 -
SELECT regexp_split_to_table(w.file_name, '^/.*/.*/......../.../') AS fn
FROM with_filename w
到目前为止的结果 - 每隔一行之前和之后都有一个空行 - 不明白为什么!
fn
file1.pdf
file2.py
file3.pdf
file8.tar.gz
/users/mcm1/my_prog.cpp
现在,我遇到了很多问题——
我知道我的正则表达式 -'^/.*/.*/......../.../'
一团糟。基本上,我将文件路径硬编码到正则表达式中,如您所见。我不接,my_prog
因为正则表达式太长了。我不确定我的重复组的概念是否正确 - 即.*
(我开始时到处都是点,经过一些阅读,我得到了点星符号)。
这是实现这一目标的最佳方式吗?我知道我必须能够改变出现的次数/../..
-'^(/.*/)'
也许使用这个?
最后,我的主要问题是我不知道如何保留文件名并消除扩展名。可能存在没有扩展名的文件。我将不胜感激,不仅要得到答案,还要解释正则表达式中发生的事情!如果需要更多数据,请告诉我!
您可以REGEXP_REPLACE
在这里使用,匹配最终之后的所有内容/
(通过匹配[^/]
之后强制执行,然后使用带有可选.xxx
扩展名的延迟匹配来匹配文件名:
SELECT
file_name,
REGEXP_REPLACE(file_name, '^.*/([^/]*?)(\.[^/.]+)?$', '\1') AS filename
FROM with_filename;
输出:
file_name filename
/users/mcm1/ualaoip2/vmm/file1.pdf file1
/users/mcm1/ualaoip2/vmm/file2.py file2
/users/mcm1/ualaoip2/vmm/file3.pdf file3
/users/mcm1/ualaoip2/vmm/file4.c file4
/users/mcm1/ualaoip2/vmm/file5.java file5
/users/mcm1/ualaoip2/vmm/file6.class file6
/users/mcm1/ualaoip2/vmm/file7 file7
/users/mcm1/ualaoip2/vmm/file8.tar.gz file8.tar
/users/mcm1/my_prog.cpp my_prog
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句