【问题标题】:Need to extract a string from a filename需要从文件名中提取字符串
【发布时间】:2016-10-18 05:56:03
【问题描述】:

我在临时表中有一个列,我将在其中插入文件名。文件名格式如下:

T225674_<suppliercode><YYYYMMDD>-<HHMM>_**<TIMBE NUMBER>**.in

例子:

T225674_789020161010-0900_12345.in

(我需要从上面的字符串中提取12345,字符串可以是任意长度)

我需要从上面的文件名中提取&lt;TIMBE NUMBER&gt;,你能告诉我们如何在Oracle SQL中做到这一点。

谢谢

【问题讨论】:

标签: sql oracle


【解决方案1】:

我确信有一个正则表达式可以做到这一点,但这不是我的强项。但是,instr 和 substr 的组合会让你到达那里:

substr(string, instr(string, '_', -1) + 1, instr(string, '.') - instr(string, '_', -1) - 1))

【讨论】:

  • 即使是最好的正则表达式解决方案(尚未提出)也会比使用instrsubstr 慢。仅当具有instrsubstr 的简单解决方案不可用时,才应使用正则表达式解决方案。不过这里有点挑剔:我还会使用-1 第三个参数来搜索句点(以防字符串中可能有其他句点,例如在供应商代码中)。
【解决方案2】:

@Rene 完美地回答了它,但为了完整起见,这里是 Regex_substr 解决方案。

answer 的修改版本。

    select 
            regexp_substr('T225674_789020161010-0900_12345.in', '(.*?_){2}(.*?)\.', 1, 1, '', 2) 
    from dual

(.*?_){2} - 第二个下划线之后的任何内容

(.*?)\.' - 小数点前的任何内容

【讨论】:

  • 感谢您的解释。
【解决方案3】:

为了更加完整(对 user3240704 眨眼),这里有一个更简单、更高效的正则表达式解决方案。即使这样也会比 Rene 的解决方案慢。

使用 OP 提供的信息:要搜索的数字前有下划线,后跟确切的字符串 '.in'(如果该信息不正确,则解决方案将失败)。

select regexp_substr(input_string, '_(\d+)\.in$', 1, 1, null, 1) from....

这将搜索下划线,后跟一个或多个数字(\d 表示数字,+ 表示一个或多个),然后是句点(转义:. 因为在正则表达式中 . 本身表示“任何字符),然后'in',后跟字符串的结尾 - 因此搜索模式锚定在输入字符串的结尾。

\d+ 放在括号中使其成为可以在regexp_substr() 函数中引用的“子表达式”。第六个参数 1 表示“从匹配的子字符串中返回作为第一个子表达式的子字符串。”

【讨论】:

  • 非常好的一段代码。答案现在肯定是“完整的”;)
【解决方案4】:

regexp_replace的解决方案:

SELECT regexp_replace(a,'(T225674_.*_)(.*)(\.in)' ,'\2') from (
  select 'T225674_789020161010-0900_12345.in' a from dual
)

第一部分(T225674_.*_) 匹配以T225674_ 开头、以_ 结尾的任何内容。然后为接下来的内容留出空间,直到结束组(.in):这是第二组(.*)的目的。

使用regexp_replace,您可以播放匹配组的内容。这里我只用\2打印第2组的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-01
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多