如何在PostgreSQL中提取子字符串模式

20

我有一列包含很多不一致的字符串。其中一些字符串包含一个一致模式的子字符串'2015mmdd_AB_CD_EFG_(text)_(text)_HIJ',我想要提取这些字符串。我感觉这是正则表达式和子字符串命令的交叉应用。

到目前为止,我最好的方法是一个相当丑陋的

substring(col_name, '........_.._.._..._.+_.+_...')

这并不能得到所需的输出,而是像'(...)_HIJ_blablabla'这样的结果。

在这种情况下,我应该如何有效地结合模式识别和子字符串选择?

1个回答

28

假设2015mmdd实际上表示某种“日期”,因此真正的数据包含例如20150713,则以下操作将执行:

substring(col_name, '[0-9]{8}_[A-Z]{2}_[A-Z]{2}_[A-Z]{3}_\([a-z]+\)_\([a-z]+\)')

此代码返回以8个数字开头,后跟下划线,接着两个大写字母,再接着下划线,接着两个大写字母,再接着下划线,接着三个大写字母,再接着下划线,接着一个小写字母的左括号,接着一个右括号,接着下划线,接着一个小写字母的左括号,接着至少一个小写字母,最后接着一个右括号的子字符串。

如果2015mmdd确实表示2015后跟字符串mmdd ,那么您需要使用以下代码:

substring(col_name, '[0-9]{4}mmdd_[A-Z]{2}_[A-Z]{2}_[A-Z]{3}_\([a-z]+\)_\([a-z]+\)')

这正是我正在寻找的,而第一行实际上就是我正在处理的情况。但是当我查询数据时它没有返回任何输出。非常感谢您的帮助,我会在我的端口上进行修复。 - thenaturalist
1
非常感谢a_horse_with_no_name,但是您的代码并不能完全满足我的需求,因为"[a-z]+_"就可以了。我在我的机器上使用PgAdmin。虽然如此,它还是解决了我的问题。 :) - thenaturalist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接