[英]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.