[英]Match exact string with fixed start and end using regex in postgresql
[英]Postgresql regex match string with substring
我有一个字符串foo,bar
我想要做的是形成一个匹配它们的查询(它们之间可以有间隙)
例如,它应该与像这样的条目匹配
aaa,bbbb,foo,zzz,bar
bar,ccc,ddddd,foo,iiiii
但不是
aaa,eeeee,foo,rrrrrr,hhhhhh
ooooo,ii,sssss,bar,xxxx
我试图匹配的列是text
类型
我试着这样做
select * from string_entries where str similar to '%(?=.*foo)(?=.*bar)%';
但我收到这个错误
ERROR: invalid regular expression: quantifier operand invalid
SQL state: 2201B
假设这些值必须显示为完整的逗号分隔条目,您可以使用
where str ~ '^(?=.*(?:,|^)foo(?:,|$))(?=.*(?:,|^)bar(?:,|$))'
在这里,它将使用~
(正则表达式匹配)运算符以任何顺序匹配包含foo
和bar
字符串。 详情:
^
- 字符串的开始(?=.*(?:,|^)foo(?:,|$))
- 在右边,应该有零个或多个字符,尽可能多,然后是一个foo
字符串(或者在字符串的开头或逗号后紧跟逗号或字符串结尾位置)(?=.*(?:,|^)bar(?:,|$))
- 紧靠右侧,应该有零个或多个字符,尽可能多,然后是bar
字符串(或者在字符串的开头或逗号后紧跟逗号或字符串结尾位置) 假设这些值必须作为整个单词出现,您可以用\\y
单词边界替换非捕获组并使用
where str ~ '^(?=.*\yfoo\y)(?=.*\ybar\y)'
请参阅在线数据库小提琴:
CREATE TABLE string_entries
(str character varying)
;
INSERT INTO string_entries
(str)
VALUES
('aaa,bbbb,foo,zzz,bar'),
('bar,ccc,ddddd,foo,iiiii'),
('aaa,eeeee,foo,rrrrrr,hhhhhh'),
('ooooo,ii,sssss,bar,xxxx')
;
select str from string_entries where str ~ '^(?=.*(?:,|^)foo(?:,|$))(?=.*(?:,|^)bar(?:,|$))';
我倾向于不使用正则表达式比较来执行此操作,而是将字符串转换为数组:
select *
from string_entries
where string_to_array(str, ',') @> array['foo', 'bar']
这仅在您需要相等比较时才有效。 如果您还想使用例如foo%
而不是foo
进行匹配,那么这将起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.