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

Regex for last n characters of String in PostgreSQL query

正则表达式检查不是我的强项。这是微不足道的,但在玩了 15 分钟之后,我认为在这里发布会更快。最终我想过滤掉 table 的任何结果,其中某个文本列值以 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}$'

这 return 是未嵌套数组中的所有内容,而我希望 return 除了第二个和最后一个值之外的所有内容。任何指向正确方向的指示将不胜感激。我正在使用 PostgreSQL v11.9

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

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

SIMILAR TO 模式需要完整的字符串匹配,所以在这里,% 匹配字符串开头的任何文本,然后 S 匹配 S[0-9]{2} 匹配必须位于字符串末尾的两个数字。

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

WHERE column_name !~ 'S[0-9]{2}$'

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