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

How to get file name without extension with using Regular Expressions

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

要提取第一对下划线之间的子字符串,您需要使用

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 组,然后匹配另一个 _.

.*/([^.]+) 模式匹配整个文本直到最后一个 /,然后使用 ([^.]+). 以外的 1 个或多个字符捕获到第 1 组中。

对于第一个要求,使用 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

希望对您有所帮助!

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

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

所以在我完成所有这些努力之后,请继续使用正则表达式解决方案。我会把它留在这里,以便其他人可以从中学习。