PostgreSQL查询中字符串的最后n个字符的正则表达式

问题描述

正则表达式检查不是我的强项。这是微不足道的,但是在玩了15分钟之后,我认为在这里发布会更快。最终,我想过滤出某个文本列值以S(01 -99)结尾的表的任何结果,即字母S后跟2位数字。考虑以下测试查询

select x.* from (
select 
unnest(array['kjkjkj','jhjs01','kjkj11','kjhkjh','uusus','iiosis99']::text[]) 
as tests ) x
where RIGHT(x.tests,3) !~ 'S[0-9]{1,2}$'

这将返回未嵌套数组中的所有内容,而我希望返回除第二个和最后一个值以外的所有内容。朝正确方向的任何指针将不胜感激。我正在使用Postgresql v11.9

解决方法

由于模式并不那么复杂,因此您实际上可以在此处使用SIMILAR TO

SELECT * FROM table
   WHERE column_name NOT SIMILAR TO '%S[0-9]{2}'

SIMILAR TO模式需要完整的字符串匹配,因此这里%匹配字符串开头的任何文本,然后S匹配S和{{1} }匹配必须在字符串末尾的两位数字。

如果要使用正则表达式,则可以使用

[0-9]{2}

或者,WHERE column_name !~ 'S[0-9]{2}$' (如果可以是一位或两位数字)。由于PostgreSQL中的正则表达式搜索不需要完整的字符串匹配,因此它只匹配'S[0-9]{1,2}$',两个(或一个或两个带有S的数字)(位于字符串({1,2})末尾。