问题描述
正则表达式检查不是我的强项。这是微不足道的,但是在玩了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}
)末尾。