如何使用正则表达式获取不带扩展名的文件名

3
我有一个包含以下值的字段,现在我想仅提取该字段值中包含"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;

1
尝试使用WHERE REGEXP_LIKE(col, '^[^_]*_xyz_[^_]*$');regexp_substr('FinalProject/MyProject/aIBM_MyProjectFile.exe.ld', '.*/([^.]+)', 1, 1, NULL, 1) - Wiktor Stribiżew
@WiktorStribiżew在Oracle中返回了IBM_MyProjectFile.exe。有没有办法仅获取文件名而不包括扩展名? - general46
谢谢@WiktorStribiżew,regexp_substr('FinalProject/MyProject/aIBM_MyProjectFile.exe.ld','./([^.]+)', 1, 1, NULL, 1) 工作了!但是第一个没有工作。你能帮我检查一下吗? select regexp_substr('Mydata2_zzz_aug22','^[^_]xyz[^_]*$') exp from dual; 我做错了什么吗? - general46
你使用 '^[^_]*_xyz_[^_]*$'regexp_substr 想要做什么?你想获取什么值?是在两个 _ 之间的值吗?可以尝试使用 regexp_substr('Mydata_xyz_aug21','_([^_]+)_', 1, 1, NULL, 1) - Wiktor Stribiżew
尝试使用 regexp_substr('Mydata_xyz_aug21','_([^_]+)_', 1, 1, NULL, 1) - Wiktor Stribiżew
显示剩余6条评论
3个回答

1
要提取第一对下划线之间的子字符串,您需要使用
regexp_substr('Mydata_xyz_aug21','_([^_]+)_', 1, 1, NULL, 1)

要获得没有扩展名的文件名,您需要:
regexp_substr('FinalProject/MyProject/aIBM_MyProjectFile.exe.ld','.*/([^.]+)', 1, 1, NULL, 1)

请注意,每个正则表达式都包含一个捕获组(在(...)内的模式),并且可以通过regexp_substr函数的最后一个1参数访问该值。 _([^_]+)_模式查找第一个_,然后将一个或多个不是_的字符放入组1中,然后匹配另一个_.*/([^.]+)模式匹配到最后一个/之前的整个文本,然后使用([^.]+)捕获一个或多个不是.的字符放入组1中。

0
对于第一个要求,只需使用如上面答案中所述的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

另一种处理方法是完全跳过正则表达式:

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

一个关于正则表达式更好的重要警告:
我的方法不能正确处理这种情况:

\this\is.a\test

所以在我付出了这么多的努力之后,还是坚持使用正则表达式的解决方案吧。我会把它留在这里,让其他人也能从中学习。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接