【问题标题】:Trying to create a regular expression [ORACLE]尝试创建正则表达式 [ORACLE]
【发布时间】:2017-06-16 05:49:45
【问题描述】:

很好,

我需要帮助来创建一个正则表达式来获取以下目录的文件名和扩展名。

/home/user/work/file1.dbf
/opt/user/file2.dfb

我正在尝试在 Oracle12C 中创建一个仅输出“file1.dbf”和“file2.dbf”的表达式。

我目前正在尝试在下一个page 上执行正则表达式并阅读以下documentation

提前致谢,希望我的解释正确。

【问题讨论】:

  • 您的问题是什么?如果您对现有代码有特定问题,请edit您的问题,包括代码并说明您的具体问题。
  • @Xufox 问题是我尝试了很多正则表达式,但我无法得到任何满足我要求的表达式。非常感谢您的评论,
  • 您的输入字符串是否总是代表文件的路径,或者您那里可能还有目录(如果做得巧妙,对于这个应用程序,它们应该在末尾显示/ 以区分它们)?如果它们可能存在并且您不希望它们包含在输出中,您始终可以添加 where 子句以首先过滤掉它们。

标签: sql regex oracle plsql oracle12c


【解决方案1】:

另一种正则表达式方法是将所有内容剥离到最后一个/

with demo as
     ( select '/home/user/work/file1.dbf' as path from dual union all
       select '/opt/user/file2.dfb' from dual )
select path
     , regexp_replace(path,'^..*/') as filename
from   demo;

【讨论】:

    【解决方案2】:

    您不需要正则表达式来执行此操作。 substrinstr 的组合就足够了。

    instr(colname,'/',-1) 获取字符串中最后一次出现的/。根据显示的数据,该位置之后的子字符串将是文件名。

    过滤器instr(colname,'/') > 0 限制其中没有/ 的行。

    select substr(colname,instr(colname,'/',-1)+1) as filename
    from tablename
    where instr(colname,'/') > 0
    

    相同的正则表达式是

    select regexp_substr(colname,'(.*/|^)(.+)$',1,1,null,2) as filename
    from tablename
    
    • (.*/|^) - 直到字符串中最后一个 / 出现的所有字符,如果没有 / 字符,则为字符串开头。

    • (.+)$ - 最后一个/ 之后的所有字符(如果它存在于字符串中)或完整字符串(如果/ 不存在)。

    它们被提取为 2 组,我们对第 2 组感兴趣。因此2 末尾的参数regexp_substr

    Read about the arguments to REGEXP_SUBSTR here.

    【讨论】:

    • 效果很好。感谢您解决我的问题并如此迅速地回答。
    • @Randomuser1204281 - 对于未来,请记住 vkp 的出色建议:尽可能使用substrinstrlike 和其他“标准”字符串函数和运算符,并且仅在以下情况下使用正则表达式要么无法使用标准函数和运算符,要么使用它们变得过于繁琐且难以管理。您会喜欢更快的执行时间!
    猜你喜欢
    • 2016-08-31
    • 2016-06-09
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2010-10-01
    • 2021-05-22
    • 2017-05-13
    • 1970-01-01
    相关资源
    最近更新 更多