PostgreSQL如何用regex_replace提取文件名与日期?
PostgreSQL 提取文件名与日期的正则方案
假设你的表名为files,存储目标文本的列名为file_info,以下是针对需求的具体实现:
提取文件名(12345678.PDF)
方法1:用regexp_replace替换无关内容
SELECT regexp_replace(file_info, '.*\\\\([^\\[]+)\\s*\\[.*', '\\1') AS filename FROM files;
正则逻辑说明:
.*\\\\:贪婪匹配到最右侧的反斜杠(定位到文件名的前置分隔符)([^\\[]+):捕获文件名,匹配所有非[的字符(文件名后紧跟[SHA1]结构)\\s*\\[.*:匹配文件名后的空格、[及后续所有内容- 最终用捕获组
\\1替换整个字符串,仅保留文件名
方法2:用substring直接捕获目标
SELECT substring(file_info FROM '\\\\[^\\\\]+\\\\([^\\[]+)\\s*\\[') AS filename FROM files;
通过正则直接定位并提取捕获组内容,结果与方法1一致。
提取日期(20221122)
方法1:基于文件名位置捕获日期
SELECT regexp_replace(file_info, '.*\\\\(\\d{8})\\\\[^\\[]+\\s*\\[.*', '\\1') AS file_date FROM files;
正则逻辑说明:
.*\\\\:匹配到倒数第二个反斜杠前的所有内容(\\d{8}):捕获8位数字格式的日期\\\\[^\\[]+\\s*\\[.*:匹配日期后的反斜杠、文件名及后续内容- 替换后保留捕获的8位日期
方法2:用regexp_match提取数组中的捕获组
SELECT (regexp_match(file_info, '\\\\(\\d{8})\\\\'))[1] AS file_date FROM files;
regexp_match返回匹配结果数组,取第一个元素即为日期(适用于文本中仅存在一处"反斜杠+8位数字+反斜杠"的场景)。
内容的提问来源于stack exchange,提问作者Alsheik
相关产品推荐
相关产品推荐

