正则表达式,它可以提取位于字符串半尾的数字

regex expression where it can extract the number positioned at the semi end in the string

https://dbfiddle.uk/?rdbms=oracle_18&fiddle=94771b6589b01526ad0cf6e5c4d01945

我需要帮助从文件名中提取数字子字符串
目前的文件格式 - 'monkey_eats_mango_everyday_202002.txt' 我们是这样做的

select regexp_substr('monkey_eats_mango_everyday_202002.txt', '\d+') as parameter12a 
from dual;

结果-

202002

这又用于更大的查询以获取此日期的最后日期,如下所示

select to_char(last_day(to_date(regexp_substr('monkey_eats_mango_everyday_202002.txt', '\d+'),  'yyyymm')), 'yyyymmdd') as parameter 
from dual ;

结果-

20200229

现在文件格式已经改变,所以我们有 - 'donkey_eats_pines_cones_20192301_7771234_everyday_202002.txt'

在这种文件格式中,其他地方有数字,例如 201943_7771234,可以是日期或任何随机数,所以我需要可以从文件格式中提取 202002 的正则表达式

select regexp_substr('donkey_eats_pines_cones_201943_7771234_everyday_202002.txt', '\d+') as parameter12a 
from dual;

一种选择是使用嵌套表达式:内部 returns 文件扩展名和日期(在该扩展名之前),外部提取日期本身。

SQL> with test (col) as
  2    (select 'donkey_eats_pines_cones_201943_7771234_everyday_202002.txt' from dual)
  3  select regexp_substr(regexp_substr(col, '\d+.\w+$'), '\d+') result From test
  4  /

RESULT
------
202002

SQL>

您可以使用 \. 将匹配的数字锚定到文件名中句点的旁边,然后在数字周围使用捕获组以仅获取输出中的数字,使用第 6 个REGEXP_SUBSTR 的参数表明您只希望输出中的第 1 组:

SELECT REGEXP_SUBSTR('donkey_eats_pines_cones_201943_7771234_everyday_202002.txt', '(\d+)\.', 1, 1, NULL, 1) AS parameter12a 
FROM dual;

输出:

202002

Demo on dbfiddle

检查这个

select reverse(split_part(reverse(r.r ), '.', 2)) from 
(
SELECT reverse(split_part(reverse('donkey_eats_pines_cones_20192301_7771234_everyday_202002.txt'), '_', 1)) as r
)as r

回答: 202002