我在临时表中有一个列,我在其中插入文件名。文件名的格式如下:
T225674_<suppliercode><YYYYMMDD>-<HHMM>_**<TIMBE NUMBER>**.in
示例:
T225674_789020161010-0900_12345.in
(我需要从上面的字符串中提取12345,字符串可以是任何长度和任何长度)
我需要从上面的文件名中提取<TIMBE NUMBER>
,请您告诉我们如何在Oracle SQL中执行此操作。
由于
答案 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的内容。