Oracle 正则表达式 - 将字符串重新格式化为类似日期的信息
Oracle regexp - reformat a string to date-like information
一列包含一种特殊文件的名称,其名称如下:“kontrolrapport-2015.12.23-10.19.05.pdf”。我想提取日期,即“2015-12-23 10:19”。
我以为这会是小菜一碟,但它需要的时间比我想象的要多一些。
这就是我能达到的程度
select 'kontrolrapport-2015.12.23-10.19.05.pdf' as file_name,
regexp_replace('kontrolrapport-2015.12.23-10.19.05.pdf','(\w*)-', '') as date_like
from dual;
为什么不使用 substr 和 to_date 函数更容易
To_date(Substr(文件名, 13,15),'yyyy.mm.dd-hh24.mi')
会return约会
如果格式是可预测的,你可以这样做:
select to_date(substr('kontrolrapport-2015.12.23-10.19.05.pdf', 16,19), 'YYYY.MM.DD-HH.MI.SS') from dual;
甚至
select to_date(replace(replace('kontrolrapport-2015.12.23-10.19.05.pdf', 'kontrolrapport-',''),'.pdf','') , 'YYYY.MM.DD-HH.MI.SS') from dual;
如果您希望将其作为问题中指示的字符串,如何将上述任一包含在 to_char 中,例如:
select to_char(to_date(substr('kontrolrapport-2015.12.23-10.19.05.pdf', 16,19), 'YYYY.MM.DD-HH.MI.SS'), 'YYYY-MM-DD HH:MI')
根据您的正则表达式示例,我假设您的文件名中有一个变量前缀,后跟连字符,后跟日期,后跟时间,然后是文件扩展名。
这是我用来提取每条信息的正则表达式 -
with f as (SELECT 'kontrolrapport-2015.12.23-10.19.05.pdf' AS file_name,
'([^-]+)-([0-9\.]+)-([0-9\.]+)\.([a-z]+)' AS regex
FROM DUAL)
select f.file_name,
regexp_substr (f.file_name, f.regex, 1, 1, 'i', 1) as prefix_part,
regexp_substr (f.file_name, f.regex, 1, 1, 'i', 2) as date_part,
regexp_substr (f.file_name, f.regex, 1, 1, 'i', 3) as time_part,
regexp_substr (f.file_name, f.regex, 1, 1, 'i', 4) as file_extension
from f;
从这里开始,也许可以进一步改进。我会将 [a-z]
和 [0-9]
替换为 POSIX 类。
一列包含一种特殊文件的名称,其名称如下:“kontrolrapport-2015.12.23-10.19.05.pdf”。我想提取日期,即“2015-12-23 10:19”。
我以为这会是小菜一碟,但它需要的时间比我想象的要多一些。
这就是我能达到的程度
select 'kontrolrapport-2015.12.23-10.19.05.pdf' as file_name,
regexp_replace('kontrolrapport-2015.12.23-10.19.05.pdf','(\w*)-', '') as date_like
from dual;
为什么不使用 substr 和 to_date 函数更容易
To_date(Substr(文件名, 13,15),'yyyy.mm.dd-hh24.mi')
会return约会
如果格式是可预测的,你可以这样做:
select to_date(substr('kontrolrapport-2015.12.23-10.19.05.pdf', 16,19), 'YYYY.MM.DD-HH.MI.SS') from dual;
甚至
select to_date(replace(replace('kontrolrapport-2015.12.23-10.19.05.pdf', 'kontrolrapport-',''),'.pdf','') , 'YYYY.MM.DD-HH.MI.SS') from dual;
如果您希望将其作为问题中指示的字符串,如何将上述任一包含在 to_char 中,例如:
select to_char(to_date(substr('kontrolrapport-2015.12.23-10.19.05.pdf', 16,19), 'YYYY.MM.DD-HH.MI.SS'), 'YYYY-MM-DD HH:MI')
根据您的正则表达式示例,我假设您的文件名中有一个变量前缀,后跟连字符,后跟日期,后跟时间,然后是文件扩展名。
这是我用来提取每条信息的正则表达式 -
with f as (SELECT 'kontrolrapport-2015.12.23-10.19.05.pdf' AS file_name,
'([^-]+)-([0-9\.]+)-([0-9\.]+)\.([a-z]+)' AS regex
FROM DUAL)
select f.file_name,
regexp_substr (f.file_name, f.regex, 1, 1, 'i', 1) as prefix_part,
regexp_substr (f.file_name, f.regex, 1, 1, 'i', 2) as date_part,
regexp_substr (f.file_name, f.regex, 1, 1, 'i', 3) as time_part,
regexp_substr (f.file_name, f.regex, 1, 1, 'i', 4) as file_extension
from f;
从这里开始,也许可以进一步改进。我会将 [a-z]
和 [0-9]
替换为 POSIX 类。