我想从给定的字符串中获取时间模式以及AM或PMAaaaa_gggg_ne_A030_66788_Abcd_Oct_24_0329PM.csv
我尝试了以下方法:
Select regexp_substr(filename,'d{4}',1,3)
From
(Select 'Aaaaa_gggg_ne_A030_66788_Abcd_Oct_24_0329PM.csv' filename from dual);
它只给了我最后一个数字,例如0329
,但我需要0329PM
。
使用这种形式的 REGEXP_SUBSTR(( 将在一次调用中获得您需要的内容。 它返回第一组,这是最后一个下划线之后和 1 个或多个数字的文本句点之前,后跟 A 或 P 然后是 M 的字符集。
with tbl(filename) as (
Select 'Aaaaa_gggg_ne_A030_66788_Abcd_Oct_24_0329PM.csv'
from dual
)
select regexp_substr(filename, '_(d+[AP]M).', 1, 1, NULL, 1)
From tbl;
实际上,要收紧匹配,您可以使其不区分大小写并添加扩展名:
select regexp_substr(filename, '_(d+[AP]M).csv', 1, 1, 'i', 1)
From tbl;
请注意,如果未找到匹配项,将返回 NULL。
嵌套substr
是一个选项(如果数据总是看起来像这样;你没有说它没有(:
SQL> with test (col) as
2 (select 'Aaaaa_gggg_ne_A030_66788_Abcd_Oct_24_0329PM.csv' from dual)
3 select substr(substr(col, -10), 1, 6) result from test
4 /
RESULT
------
0329PM
SQL>
- 内部
substr
返回最后 10 个字符 (0329PM.csv
( - 外部
substr
返回其中的前 6 个字符 (0329PM
(
或者,使用正则表达式:
SQL> with test (col) as
2 (select 'Aaaaa_gggg_ne_A030_66788_Abcd_Oct_24_0329PM.csv' from dual)
3 select regexp_substr(translate(col, '_.', ' '), 'S+',
4 1,
5 regexp_count(translate(col, '_.', ' '), 'S+') - 1
6 ) result
7 from test;
RESULT
------
0329PM
SQL>
- 第 #3 行:
translate
用空格替换下划线和点 - 行#4:从头开始
- 第 #5 行:返回子字符串,该子字符串在最后一个之前