提取日期以及预言机中的 am 或 pm



我想从给定的字符串中获取时间模式以及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 行:返回子字符串,该子字符串在最后一个之前

最新更新