【问题标题】:How to get file name without extension with using Regular Expressions如何使用正则表达式获取不带扩展名的文件名
【发布时间】:2019-02-19 05:28:04
【问题描述】:

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

【问题讨论】:

  • 没有用 @ran_0315 返回了 aIBM_MyProjectFile.exe.ld 但是,我只想得到一个 IBM_MyProjectFile
  • 添加更多样本数据,并指定预期结果。
  • 试试WHERE REGEXP_LIKE (col, '^[^_]*_xyz_[^_]*$');regexp_substr('FinalProject/MyProject/aIBM_MyProjectFile.exe.ld','.*/([^.]+)', 1, 1, NULL, 1)
  • @WiktorStribiżew 在 Oracle 中返回了 IBM_MyProjectFile.exe。有没有办法只获取没有扩展名的文件名?
  • 我更新了我上面的评论建议,请检查并让他们知道它们是否适合你。

标签: sql regex oracle regexp-substr


【解决方案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 组,然后匹配另一个 _

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

【讨论】:

    【解决方案2】:

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

    希望对你有帮助!

    【讨论】:

      【解决方案3】:

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

      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
      

      一个 BIG 警告,正则表达式更好:

      我的方法没有正确处理这种情况:

      \this\is.a\test

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

      【讨论】:

        猜你喜欢
        • 2022-11-19
        • 2015-06-08
        • 2013-03-18
        • 2020-03-11
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 2018-12-29
        相关资源
        最近更新 更多