需要从文件名中提取字符串

时间:2016-10-18 05:56:04

标签: sql oracle

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

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

示例:

T225674_789020161010-0900_12345.in

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

我需要从上面的文件名中提取<TIMBE NUMBER>,请您告诉我们如何在Oracle SQL中执行此操作。

由于

4 个答案:

答案 0 :(得分:2)

我确信有一个正则表达式,但这不是我最强的观点。但是,instr和substr的组合将帮助您:

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

答案 1 :(得分:1)

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

answer的更改版本。

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

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

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

答案 2 :(得分:1)

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

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

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

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

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

答案 3 :(得分:0)

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打印组n°2的内容。